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



我有两个数据库在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 

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

看起来你想要output子句这将允许你隐藏插入的值。

-- 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语句中放入常数值,而不是分两步进行操作。。。

在示例中,您有:

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 

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