使用Case When Exists条款更新

时间:2016-05-19 17:35:14

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

我有两张桌子。我需要使用' 1'更新一个表中的一列。和' 0'。拥有' 1'其中E_ID在两列中匹配,并且' 0'其中E_ID在第二个表中不存在。
注意:一个表具有所有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

1 个答案:

答案 0 :(得分:4)

您尚未将子查询与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