【问题标题】:Capturing a relation between two rows while one of the two rows being inserted在插入两行之一时捕获两行之间的关系
【发布时间】:2011-05-03 10:51:22
【问题描述】:

请耐心等待我解释我的情况。 我有以下两个表:

Items(id, plan, free)

-- ‘id’是标识列。

ItemsIncludes(MasterId, IncludeId)

有两种类型的项目 - 购买和免费(包括)。无论如何,这两种类型的项目都存储在 Items 表中(显然位字段“free”是根据类型设置的)。 ItemsIncludes 表在购买的商品 (MasterId) 和免费随附的商品 (IncludeId) 之间建立一对多的关系。

第 1 步是从购物车中插入购买的商品(没问题)。

第 2 步是根据购买项目的计划为插入的每个购买项目插入免费项目(这与面临的问题无关)。

第 3 步是将前 2 步中生成的 ID 以正确的关系插入到 ItemsIncludes 表中(问题)。

要求是捕获插入期间生成的免费 itemId 及其购买的 itemId。如果以下是合法的,则输出子句会这样做:

第二步--

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 列表的任何标识符的语句。例如:

注意:我没有运行以下示例,但它是合法的。

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

简而言之,如果我不能使用输出子句执行此操作,那么我如何捕获生成的免费 itemId 以及为其生成的已购买 itemId?

如果可能的话,我愿意查看而不是触发方法。最根本的是我不想改变结构。例如。我不想删除 ItemsIncludes 表并将 MasterItemId 包含到 Items 表中。

这个问题起初看起来很简单,但现在让我很紧张

【问题讨论】:

    标签: sql-server tsql insert identity


    【解决方案1】:

    如果您使用 SQL Server 2008,您可以使用 merge 而不是插入并获取 ID 之间的映射。

    查看此问题以了解有关如何操作的更多详细信息。

    Using merge..output to get mapping between source.id and target.id

    【讨论】:

    • 谢谢!有效。我有合并的想法,但与您在链接问题中的怀疑理由相同。它实际上似乎是在破解记录在案的合并目的,但看起来这种情况没有其他最佳解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2014-09-07
    • 2011-03-28
    • 1970-01-01
    • 2022-08-15
    相关资源
    最近更新 更多