TSQL 使用子查询更新值
TSQL update value with subquery
我有 2 个 table,我想比较它们并修改 tableA
(set NameMod = 1
),如果它有不同的行。
为了比较 table,我使用:
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
,在这种情况下,它会更新 table 中的所有元素,而不是不同的行。
你能试试这个吗:
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];
我有 2 个 table,我想比较它们并修改 tableA
(set NameMod = 1
),如果它有不同的行。
为了比较 table,我使用:
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
,在这种情况下,它会更新 table 中的所有元素,而不是不同的行。
你能试试这个吗:
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];