使用LEFT OUTER JOIN WHERE然后更新相同的数据

时间:2014-09-24 22:17:20

标签: sql sql-server left-join

我有两个在MSSQL 2005,SOURCE和DESTINATION上运行的数据库,它们具有相同的结构和表格。

我正在尝试将数据从s更新为d。

在这个例子中,我正在尝试使用连接将数据从s复制到d,并且只引入不在d中的条目。

然后我尝试更新刚刚插入vales的相同记录:

INSERT DESTINATION.ITEM_REPLENISH_VENDOR ([ITEM_CODE],[VEND_CODE],[PRIMARY_VENDOR],[PURCHASE_MEASURE],[STD_COST],[LAST_COST],[EOQ],[VENDOR_PART_NO],[LEAD_TIME],[COST])
SELECT s.[ITEM_CODE],s.[VEND_CODE],s.[PRIMARY_VENDOR],s.[PURCHASE_MEASURE],s.[STD_COST],s.[LAST_COST],s.[EOQ],s.[VENDOR_PART_NO],s.[LEAD_TIME], s.[COST] FROM SOURCE.dbo.ITEM_REPLENISH_VENDOR s 
LEFT OUTER JOIN DESTINATION.dbo.ITEM_REPLENISH_VENDOR d ON (d.ITEM_CODE = s.ITEM_CODE)
WHERE d.ITEM_CODE IS NULL 
UPDATE DESTINATION.dbo.ITEM_REPLENISH_VENDOR
SET VEND_CODE='100004', PRIMARY_VENDOR='T',STD_COST='0',LAST_COST='0',COST='0'
WHERE 

我的问题是,一旦我到达第二个我不知道如何参考我刚刚更新的数据。这个脚本将在设定的时间每天运行,我不想用这些值覆盖整个列,只是在这次执行时插入的条目。

2 个答案:

答案 0 :(得分:0)

看起来你想要output clause这会让你隐藏插入的值。

-- item_code needs to have the same type as the source table
declare @inserted table (item_code int not null primary key);

insert destination.item_replenish_vendor (
    [item_code], [vend_code], [primary_vendor],
    [purchase_measure], [std_cost], [last_cost],
    [eoq], [vendor_part_no], [lead_time],[cost]
) -- save inserted values
output 
    inserted.item_code into @inserted
select
    s.[item_code], s.[vend_code], s.[primary_vendor],
    s.[purchase_measure], s.[std_cost], s.[last_cost],
    s.[eoq], s.[vendor_part_no], s.[lead_time], s.[cost] 
from
    source.dbo.item_replenish_vendor s 
        left outer join
    destination.dbo.item_replenish_vendor d
        on d.item_code = s.item_code
where
    d.item_code is null;

update
    d
set
    vend_code = '100004',
    primary_vendor = 'T',
    std_cost = '0',
    last_cost = '0,
    cost = '0'
from
    destination.dbo.item_replenish_vendor d
        inner join
    @inserted i
        on d.item_code = i.item_code;

在这种情况下,您可以在insert语句中放置常量值,而不是分两步执行...

答案 1 :(得分:0)

在示例中,您有:

UPDATE DESTINATION.dbo.ITEM_REPLENISH_VENDOR
SET VEND_CODE='100004', PRIMARY_VENDOR='T',STD_COST='0',LAST_COST='0',COST='0'

如果您的VEND_CODE,PRIMARY_VENDOR,STD_COST,LAST_COST,COST始终是静态值,您可以将它们放入第一个查询中。

INSERT DESTINATION.ITEM_REPLENISH_VENDOR ([ITEM_CODE],[VEND_CODE],[PRIMARY_VENDOR],[PURCHASE_MEASURE],[STD_COST],[LAST_COST],[EOQ],[VENDOR_PART_NO],[LEAD_TIME],[COST])
SELECT s.[ITEM_CODE],'100004','T',s.[PURCHASE_MEASURE],'0','0',s.[EOQ],s.[VENDOR_PART_NO],s.[LEAD_TIME], '0' 
FROM SOURCE.dbo.ITEM_REPLENISH_VENDOR s 
LEFT OUTER JOIN DESTINATION.dbo.ITEM_REPLENISH_VENDOR d ON (d.ITEM_CODE = s.ITEM_CODE)
WHERE d.ITEM_CODE IS NULL 

但如果确实需要在插入后计算,那么我同意劳伦斯的方法。