sql-server - 使用 Case When Exists 子句进行更新

标签 sql-server sql-update case where-clause exists

我有两张 table 。我需要用“1”和“0”更新一张表中的一列。如果 E_ID 在两列中都匹配,则为“1”;如果 E_ID 在第二个表中不存在,则为“0”。
注意:一个表包含所有 E_ID,第二个表包含 E_ID 的子集。两个故事中的 E_ID 列均不包含 NULL。

下面的查询仅执行作业的第一部分(更新为“1”)。

UPDATE [MIDASFactory].[dbo].[Employees] 
SET  [Changed To Residential] = 1
FROM  ##formerEmployees t
INNER JOIN [dbo].[Employees] (NOLOCK)
     ON t.e_ID = E_ID

我修改了上面的查询,也按照上面的描述用“1”和“0”进行更新。

但它无法正常工作,因为它将所有行更新为第一个值 由下面查询中的 select 子句返回,其中 E_ID 在两个表中都匹配。

UPDATE [dbo].[Employees] 
SET  [Current Employee] = 
    CASE WHEN EXISTS (SELECT * FROM [dbo].[Employees] P (NOLOCK) 
                      LEFT OUTER JOIN  ##formerEmployees t (NOLOCK) ON P.E_ID=t.e_ID)
            THEN 1 
            ELSE 0
        END 
FROM  ##formerEmployees t

最佳答案

您尚未将子查询与 UPDATE 查询(Employees)相关联。您可能认为您正在通过 JOIN 执行此操作,但实际上您只是创建第二个单独的对Employees 的引用,该引用与您的外部查询无关。

这应该有效:

UPDATE e
SET  [Current Employee] = 
    CASE WHEN EXISTS (SELECT * FROM ##formerEmployees t (NOLOCK) WHERE e.E_ID=t.e_ID)
            THEN 1 
            ELSE 0
        END 
FROM  [dbo].[Employees] e

关于sql-server - 使用 Case When Exists 子句进行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37330357/

相关文章:

Excel 连接到 Access 时性能较低

sql - 如果子查询在 Postgres 中返回多行,则跳过行

c++ - Switch Case 总是默认

bash - 如何在没有 `;&` 的 Bash 3.2 中链接案例?

sql-server - 不带 SQL Server 的 Visual Studio 2015

mysql - 数据库可移植性(sql server 到 mysql、postgresql)

SQL 选择不同列和最新日期

mysql - 如果 MySQL 中的计数大于 5,则更新

c - 在 C 中如何使用大小写将枚举转换为字符串?

sql - 根据新插入记录的主键更新记录的外键字段