比较两个SQL Server表中的值,然后根据条件进行更新

比较两个SQL Server表中的值,然后根据条件进行更新,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有两个数据库表,我想根据它们的公共列之间的匹配来更新第一个表。这是我的密码: update Table1 set comment = 'Valid stuff' where Name in ( SELECT T1.name FROM Table1 AS T1 INNER JOIN Table AS T2 on T1.name = t2.name

我有两个数据库表,我想根据它们的公共列之间的匹配来更新第一个表。这是我的密码:

update Table1
set comment = 'Valid stuff'
where Name in (
               SELECT T1.name
               FROM Table1 AS T1
               INNER JOIN Table AS T2
                 on T1.name = t2.name
                 and T1.id = T2.id)
如果没有匹配项,则应添加另一个值,如“坏东西”。你认为这是我应该做的最好的事情吗?

最好是:

update t1 set comment = 
  case when exists 
      (Select * from Table 
       Where id = t1.id
          and name = t1.name)
    then 'Valid stuff'
    else 'bad stuff' end
from table1 t1

也许是这样的:

UPDATE T1
SET comment = CASE WHEN ou.name IS NULL THEN 'bad stuff' ELSE 'Valid stuff' END
FROM Table1 T1
OUTER APPLY (SELECT T2.name
             FROM Table T2
             WHERE T1.name = t2.name AND T1.id = T2.id) ou

您只检查t1中的项目是否在t2中,对吗?应该是在何时而不是在何处?@VDK。我不喜欢这个答案使用的约定(
select*
for exists,比较没有表别名的表)。然而,我认为它不值得否决,即使是语法错误——特别是因为
case exists
可能是最好的答案。@GordonLinoff不幸的是,它不允许我删除降级。但如果你不介意的话,我想问你一个问题:为什么你不喜欢在存在中选择?@VDK,是的,大脑fa*t
时,其中
是正确的。@VDK,他不喜欢它-(如果我为你说错了,请纠正我,Gordon),因为在
选择*
的所有其他用法中(除了
存在
不存在
中),它会使要获取的列集不明确。因此,在一种情况下,例如,可能依赖某个特定列的用户可能会因为编译失败而不知道该列是否在将来的模式更改中被错误命名。其他情况也受到影响。对于一些SQL用户来说,这些结果都不适用于在
存在的
中使用
select*
,这一事实似乎并不重要。