我有2个表,想要比较它们并修改tableA
(set NameMod = 1
),如果它有不同的行。
要比较我使用的表:
select Id, Name from tableB
except
select Id, Name from tableA
然后我想修改tableA
:
update tableA Set NameMod = 1
where exists (
select Id, Name from tableB
except
select Id, Name from tableA
)
但我只能在子查询之前使用EXISTS
,在这种情况下,它会更新表中的所有元素而不是不同的行。
答案 0 :(得分:2)
你可以试试这个:
MERGE TableA AS [Target]
USING TableB AS [Source]
ON [Target].[ID] = [Source].[ID]
AND [Target].[Name ] = [Source].[Name]
WHEN NOT MATCHED BY TARGET
THEN UPDATE SET NameMod = 1;
它正在使用MERGE子句。
如果您不喜欢该条款,可以像这样使用CTE
:
;WITH IdsForUpdate ([id]) AS
(
SELECT DISTINCT Id
FROM
(
select Id, Name from tableB
except
select Id, Name from tableA
) DS([id], [name])
)
update tableA
Set NameMod = 1
FROM tableA A
INNER JOIN IdsForUpdate B
ON A.[id] = B.[id];