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