Захват отношения между двумя строками при вставке одной из двух строк - PullRequest
2 голосов
/ 03 мая 2011

Пожалуйста, будьте терпеливы, пока я объясняю свой сценарий.У меня есть следующие две таблицы:

Items(id, plan, free)

- 'id' - это столбец идентификаторов.

ItemsIncludes(MasterId, IncludeId)

Существует два типа предметов - купленные и бесплатные (включены).Независимо от этого, оба типа элементов хранятся в таблице элементов (очевидно, битовое поле «свободный» устанавливается в соответствии с типом).Таблица ItemsIncludes устанавливает отношение «один ко многим» между купленным предметом (MasterId) и предметами, включенными в него бесплатно (IncludeId).

Шаг 1 - вставить купленные предметы из корзины (без проблем).

Шаг 2 - вставить бесплатные предметы для каждого приобретенного предмета, вставленного на основе плана приобретенного предмета (который не имеет ничего общего с проблемой).

Шаг 3 - вставить идентификаторы, созданные во времяэто первые 2 шага в их правильном отношении к таблице ItemsIncludes (проблема).

Требуется захватить бесплатный itemId, сгенерированный во время вставки, вместе с его приобретенным itemId.Выходное предложение сделало бы это, если бы следующее было допустимо:

Шаг 2 -

Declare @ItemsIncludesIntermediate table(MasterId int, IncludeId int)
Insert into Items
(PlanId, IsFree)
Output it.ID -- Illegal
, inserted.ID into @ItemsIncludesIntermediate
Select pli.IncludePlanId, 1
From Items it
Join PlansIncludes pli on it.PlanId = pli.MasterPlanId

Структура плана также аналогична, но не относится к рассматриваемой проблеме, поэтому не описана.

SQL Server не позволяет ссылаться на что-либо, кроме вставленных столбцов, в условии вывода во время вставки;однако, это не то же самое в случае обновлений / удалений, в которых допустимы операторы, ссылающиеся на любой идентификатор, участвующий в списке FROM.EG:

Примечание: я не запускал следующий пример, но он допустим.

Delete Items
Output iti.MasterID, deleted.ID into @ItemsIncludesIntermediate
From items it
Join ItemsIncludes iti on it.ID = iti.IncludeId

Короче говоря, если я не могу сделать это с помощью предложения output, то как мне получитьбесплатный itemId, как он генерируется вместе с купленным itemId, для которого он генерируется?

Я открыт для просмотра и вместо триггерного подхода, если это возможно.Принципиальная вещь в том, что я не хочу менять структуру.Например, я не хочу удалять таблицу ItemsIncludes и включить MasterItemId в таблицу Items.

Сначала проблема выглядела просто, но теперь действует мне на нервы

1 Ответ

1 голос
/ 03 мая 2011

Если вы используете SQL Server 2008, вы можете использовать merge вместо вставки и получить соответствие между идентификаторами.

Посмотрите на этот вопрос для получения более подробной информации о том, как это сделать..

Использование merge..output для отображения между source.id и target.id

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