使用“存在时的情况”子句进行更新

eni*_*205 2 sql-server case exists where sql-update

我有两张桌子。我需要用“ 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
Run Code Online (Sandbox Code Playgroud)

如上所述,我修改了上面的查询以也用“ 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
Run Code Online (Sandbox Code Playgroud)

Tab*_*man 5

您尚未将子查询与UPDATE查询(员工)相关联。您可能以为您是用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
Run Code Online (Sandbox Code Playgroud)