子查询

时间:2015-06-15 08:10:22

标签: sql-server tsql sql-update compare

我有2个表,想要比较它们并修改tableAset 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,在这种情况下,它会更新表中的所有元素而不是不同的行。

1 个答案:

答案 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];