Дублирующиеся данные через отношение «один ко многим» (Tsql) - PullRequest
1 голос
/ 26 сентября 2008

Извините, если заголовок плохо описательный, но я не могу сейчас лучше = (

Итак, у меня есть схема мастер-детализации, где детализация представляет собой древовидную структуру (отношение один ко многим) с n уровнями (в SQLServer 2005)

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

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

table model for the problem

Это, конечно, пример модели, и я пытаюсь скопировать структуру детали с одного мастера на другой. Фактически, я создаю новый мастер, используя существующий в качестве шаблона.

Ответы [ 2 ]

1 голос
/ 26 сентября 2008

Если я понимаю проблему, это может быть тем, что вы хотите:

INSERT dbo.Master VALUES (@NewMaster_ID, @NewDescription)

INSERT dbo.Detail (parent_id, master_id, [name])
SELECT detail_ID, @NewMaster_ID, [name]
FROM dbo.Detail 
WHERE master_id = @OldMaster_ID

UPDATE NewChild
SET parent_id = NewParent.detail_id
FROM dbo.Detail NewChild
JOIN dbo.Detail OldChild
ON NewChild.parent_id = OldChild.detail_id
JOIN dbo.Detail NewParent
ON NewParent.parent_id = OldChild.parent_ID
WHERE NewChild.master_id = @NewMaster_ID
AND   NewParent.master_id = @NewMaster_ID
AND   OldChild.master_id = @OldMaster_ID

Хитрость заключается в том, чтобы использовать старый detail_id в качестве нового parent_id в начальной вставке. Затем присоединитесь к старому набору строк, используя это отношение, и обновите новые значения parent_id.

Я предположил, что detail_id - это значение IDENTITY. Если вы назначите их самостоятельно, вам нужно будет предоставить подробную информацию, но есть аналогичное решение.

0 голосов
/ 26 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...