SQL Update从另一个表中设置,其中字段不相等

时间:2014-07-03 14:33:10

标签: sql sql-update

我们说我有2个表USER1(id, first, last)USER2(id, first, last)。我想通过在1.id = 2.id上选择USER1来编写更新USER2的查询,并且仅更新不同的字段。例如,仅在第一个(s)不同时才首先更新。请帮忙。

2 个答案:

答案 0 :(得分:1)

Update User1 
     set 
          u1.first= select 
                        case when u2.first<>u1.first then u2.first 
                             else u1.first end,
          u1.last=  select 
                        case when u2.last<>u1.last then u2.last 
                             else u1.last end
from User1 as u1
outer apply 
     (
        select ui2.first, ui2.last 
        from User2 as ui2 
        where (ui2.first<>u1.first or ui2.last<>u1.last )
     ) 
        as u2 
where u2.Id=u1.Id

答案 1 :(得分:1)

如果您不想冒险进入OUTER APPLY,您可以通过简单的连接执行相同的操作,它们在查询优化器上通常更容易。

关于您的编辑隔离列更改,我非常确定您在单独的案例中考虑名字和姓氏更新后无法获得任何结果。我不确定DB2,但是MS SQL通过删除行并将其插入新值来处理UPDATE,因此更新第一个和最后一个的成本与单独更新任何一个相同。将它们放在2个案例中会使您需要维护的代码加倍,并且当同一记录的第一个和最后一个更改时,成本加倍。

DECLARE @User1 TABLE (ID int, [First] varchar(50), [Last] varchar(50))
DECLARE @User2 TABLE (ID int, [First] varchar(50), [Last] varchar(50))

INSERT INTO @User1 VALUES (1, 'Alice', 'Smith'), (2, 'Bill', 'Brown'), (3, 'Chuck', 'Calvert')
INSERT INTO @User2 VALUES (1, 'Alice', 'Aarons'), (2, 'Bob', 'Brown'), (4, 'Charlie', 'Calvert')

SELECT * FROM @User1
SELECT * FROM @User2

UPDATE @User1 
SET [First] = U2.[First], [Last] = U2.[Last] 
FROM @User1 as U1 inner join @User2 as U2 on U1.ID = U2.ID 
WHERE U1.[First] != U2.[First] OR U1.[Last] != U2.[Last]

SELECT * FROM @User1
SELECT * FROM @User2