Создание новых элементов и присоединение их к родительскому элементу через таблицу соединений в SQL

Я переношу модель базы данных, в которой мне нужно изменить отношение 1:n на отношение n:m.

Мне нужно INSERT данные в новую таблицу и использовать ID, сгенерированный в процессе, для заполнения таблицы соединений.

Таблицы называются Parts и Document, а таблица соединения между ними называется PartDocument.

Теперь я хочу создать два уникальных documents (с типами/именами/описаниями по умолчанию) для каждого part и связать их с соответствующим part через таблицу соединений. Я могу легко создать 2*N documents, но мне трудно понять, как связать каждый из них с таблицей соединения PartDocument.

INSERT INTO Document (Type, Name, Description)
SELECT 1, 'Work Instructions', 'Work Instructions'
FROM Parts
GO

INSERT INTO Document (Type, Name, Description)
SELECT 2, 'Drawing', 'Drawing'
FROM Parts
GO

INSERT INTO PartDocument (PartID, DocumentID)
?????

В моей таблице соединений PartDocument всего два столбца, PartID и DocumentID, которые вместе используются как составной ключ.

Мой желаемый результат заключается в том, что у меня будет два документа для каждой части, и каждый из них будет связан с соответствующей частью через таблицу соединений.

Я использую SQL Server Express 2012. http://sqlfiddle.com/#!6/b51f0


person hashtable    schedule 20.05.2013    source источник


Ответы (2)


В итоге я добавил временный столбец PartID при создании таблицы Document. Затем я мог бы удалить этот столбец после того, как создал и связал документы.

Итак, в основном это:

INSERT INTO Document (Type, Name, Description, PartID)
SELECT 1, 'Work Instructions', 'Work Instructions', Part.ID
FROM Part
GO

INSERT INTO PartDocument
SELECT Document.PartID, Document.ID
FROM Document
GO

ALTER TABLE Document
DROP COLUMN PartID
GO
person hashtable    schedule 21.05.2013
comment
вы должны пометить ответ как правильный (с крючком под цифрами). - person Angelo Fuchs; 21.05.2013
comment
@Angelo Neuschitzer Это заставляет меня ждать, чтобы ответить на мой собственный вопрос, а затем дольше, чтобы принять. XD Спасибо за помощь кстати. :) - person hashtable; 21.05.2013

INSERT INTO Document (Type, Name, Description)
SELECT 1, 'Work Instructions', 'Work Instructions'
FROM Parts
GO

INSERT INTO Document (Type, Name, Description)
SELECT 2, 'Drawing', 'Drawing'
FROM Parts
GO

INSERT INTO PartDocument (PartID, DocumentID)
SELECT part.id, document.id
FROM Parts part
INNER JOIN Document document ON part.field1 = document.field1
GO

Сложный элемент — это часть ON в INNER JOIN в последнем выборе. Вы должны выбрать линии, которые вы только что создали, вместе с элементами частей, из которых они произошли.

person Angelo Fuchs    schedule 20.05.2013
comment
INSERT SELECT создает 1 документ для каждой части. Таким образом, после запуска обеих вставок у меня в два раза больше документов, чем частей. Идентификаторы документов создаются автоматически, и я не знаю идентификаторов частей. Они берутся из базы данных. Я не думаю, что это совсем то, что я ищу. хД - person hashtable; 21.05.2013
comment
@hashtable Если вы этого хотите, у вас не должно быть таблицы перекрестных соединений. Было бы лучше иметь PartID в вашем документе. (Или документ может быть связан более чем с одной частью?) - person Angelo Fuchs; 21.05.2013
comment
Документы могут быть связаны более чем с одной частью в новой версии базы данных. (В старой версии нельзя). Это часть моего сценария переформатирования и переноса старых данных в новую модель базы данных. После того, как я свяжу их, я собираюсь создать DocumentVersions, которые указывают на эти заполнители документов. Так что да, я хочу присоединиться к таблице. хД - person hashtable; 21.05.2013
comment
@hashtable Итак, вам придется использовать более сложные и специфичные для базы данных решения (например, триггеры, обновляемые представления или аналогичные). Какую базу данных вы используете и можно ли здесь использовать язык программирования (и какой?) - person Angelo Fuchs; 21.05.2013
comment
@hashtable Кроме того, я изменил свой ответ на новый подход, который может сработать, но для этого мне потребуется больше данных о ваших настройках. Рассматривали ли вы возможность настройки SQLFiddle для демонстрации этого? - person Angelo Fuchs; 21.05.2013
comment
Я использую SQL Server Express и надеялся выполнить задачу в сценарии обновления базы данных, где я вношу изменения в ORM. xD Но это кажется трудным. - person hashtable; 21.05.2013
comment
Решил проблему. : D Не могу опубликовать ответ в течение 3 часов. ›-‹ - person hashtable; 21.05.2013