SQL - 如何使用插入的输出来更新表

时间:2015-06-10 15:57:18

标签: sql sql-server sql-update sql-insert

问题信息

详细问题

我能解释我问题的最好方法是解释我想要的结果。我试图占用一组办公室,将其数据插入dbo.DeliveryLocation表,然后输出 inserted.DeliveryLocationId 并更新相应的办公室具有该ID的DeliveryLocationId 字段。

期望的结果示例

Office数据之前

OfficeId | DeliveryLocationId
-----------------------------
1        | null

2        | null

3        | null
  

运行SQL语句

之后的Office数据

OfficeId | DeliveryLocationId
-----------------------------
1        | 5

2        | 6

3        | 7
  • 使用,创建DeliveryLocationId为5的交付位置 OfficeId为1

  • 的Office数据
  • 使用Delivery创建了DeliveryLocationId为6的交付位置 办公室的数据,OfficeId为2

  • 使用,创建了DeliveryLocationId为7的交付位置 办公室的数据,OfficeId为3

问题

根据我下面的当前SQL脚本,您可以看到我已完成第一部分(将Office数据插入交付位置表)。第二部分(使用创建的交付位置的相应DeliveryLocationId更新Office)尚未完成,我不确定如何执行此操作。

我最初的想法/解决方案

如果有办法存储相关的OfficeId和DeliveryLocationId,也许我们可以循环遍历它们并在第二个SQL语句中更新办公室,而不是尝试创建一个可以执行所有操作的SQL语句。

参考

dbo.DeliveryLocation

    [DeliveryLocationId] [int] IDENTITY(1,1) NOT NULL,
    [LocationName] [nvarchar](max) NULL,
    [ShortName] [nvarchar](max) NULL,
    [ValidatedAddressId] [int] NOT NULL,
    [DropoffInstruction] [nvarchar](max) NULL,
    [PickupInstruction] [nvarchar](max) NULL,
    [TaxRate] [decimal](18, 2) NOT NULL,
    [Active] [bit] NOT NULL,
    [DisableOffices] [bit] NOT NULL

dbo.Office

    [OfficeId] [int] IDENTITY(1,1) NOT NULL,
    [OfficeName] [nvarchar](max) NULL,
    [ValidatedAddressId] [int] NOT NULL,
    [ReferralSource] [nvarchar](max) NOT NULL,
    [NumberOfEmployees] [int] NOT NULL,
    [DeliveryLocationId] [int] NULL

当前SQL

insert into
    dbo.DeliveryLocation
(LocationName, ShortName, ValidatedAddressId, Active, DisableOffices)
output
    inserted.DeliveryLocationId
select 
    OfficeName, OfficeName, ValidatedAddressId, 0, 0 
from
    dbo.Office as o
where
    OfficeId in
    (
    select distinct 
        OfficeId 
    from 
        dbo.[User] as u
    where
        u.DeliveryLocationId is null
    and
        u.OfficeId is not null
    )

2 个答案:

答案 0 :(得分:2)

我不确定在INSERT语句中执行此操作,但如果您使用Office(或基于Office的查询)作为源MERGE语句,您将能够在OUTPUT子句中引用source.OfficeId以及inserted.DeliveryLocationId。您只需跳过更新并删除MERGE的使用情况,并仅使用ON NOT MATCHED子句。

当我做这样的事情时,我将输出放入临时表中,然后从那里执行我需要做的任何进一步更新或插入。

如果你之前没有使用过MERGE语句(或者甚至没有使用过他们所有功能的人),这是一个关于如何使用它们的非常棒的资源,以及如何使用好好利用它们:http://www.made2mentor.com/2012/07/got-the-urge-to-merge/

答案 1 :(得分:0)

您可以在插入交​​货地点后执行更新加入

update dbo.Office
set o.DeliveryLocationID = dl.DeliveryocationID
from Office o
JOIN DeliveryLocation dl on dl.LocationName = o.OfficeName

假设Office名称是唯一的。如果不是,您可能希望至少暂时将OfficeID添加到DeliveryLocations表中,然后加入。