Копировать в модель смежности - PullRequest
1 голос
/ 24 ноября 2010

Мне нужно создать хранимую процедуру sql (Sql Server 2008 - T-SQL), которая копирует узел в модели смежности.

В таблице можно видеть два столбца: Id и ParentId (от FK доЯ бы).Копирование означает, что необходимо копировать и всех подчиненных.

Я думаю, что использование WITH - хорошее начало, но мне интересно, могу ли я сделать эту копию без использования курсоров.

Ответы [ 2 ]

1 голос
/ 24 ноября 2010

Основная проблема со списками смежности состоит в том, что в SQL нет общего способа извлечь целое поддерево, поэтому у вас уже есть проблема определения всех строк, которые нужно дублировать, не прибегая к курсору.

Если возможно, перенесите список смежности в модель вложенного множества, которая позволяет вам легко идентифицировать все узлы поддерева. Однако ведение модели вложенного набора является более сложным для общих вставок и удалений.

РЕДАКТИРОВАТЬ: Как указано 'a_horse_with_no_name', - это способ в общем случае SQL обрабатывать списки смежности, рекурсивные общие табличные выражения.

0 голосов
/ 25 ноября 2010

Копирование всего поддерева - небольшая проблема, потому что когда вы копируете свое поддерево, вы либо

  • денормализация данных или
  • используя его как шаблон какого-то рода.

В любом случае вы перетаскиваете данные в несогласованное состояние в какой-то момент, что указывает на некоторые проблемы с вашим дизайном (например, в ваших записях должно быть несколько родителей или нет? *

Итак, вы должны обновить ответ более полным примером того, что вы пытаетесь сделать.

Одним из решений будет иметь временную таблицу, выбор для вставки не должен быть проблемой, это просто обновление ссылочных идентификаторов, что будет проблемой.

Итак

  1. со вставкой во временную таблицу
  2. ОБНОВЛЕНИЕ идентификаторов
  3. ВСТАВИТЬ в оригинальный стол
  4. УДАЛИТЬ временные записи

Процедура должна быть такой, потому что было бы трудно изменить идентификаторы (как идентификаторы записей, так и идентификаторы, относящиеся к родителю) в начальном WITH INSERT. Однако это может быть возможно, если есть хорошая функция, которая зависит только от max_id или только от старых идентификаторов.

...