使用子查询和Case语句进行更新

时间:2017-02-20 12:07:54

标签: sql oracle vertica

我正在编写一个带有一些case语句的更新查询。当情况不满足时,它将用NULL更新列 以下是查询:

 UPDATE TGT
 SET C1 = CASE WHEN TGT.c2 = SRC.c2 AND SRC.C3 = 'P' THEN SRC.C1 ELSE NULL END,
     C4 = CASE WHEN TGT.c5 = SRC.c5 AND SRC.C3 = 'D' THEN SRC.C4 ELSE NULL END
    FROM SRC;

即使数据存在于Source表中,也始终填充NULL。

先谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

Oracle在from语句中不支持joinupdate。但是,您可以使用子查询:

UPDATE TGT
    SET C1 = (CASE WHEN EXISTS (SELECT 1
                                FROM SRC
                                WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                   THEN TGT.C1 ELSE NULL
              END);

注意:以上内容将更新所有行。如果您只想更新不匹配的行,请在not exists子句中使用where

UPDATE TGT
    SET C1 = NULL
    WHERE NOT EXISTS (SELECT 1
                      FROM SRC
                      WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                     );

答案 1 :(得分:0)

你想设置c1 null,其中没有相关的' P' src中的记录存在。因此使用NOT EXISTS

UPDATE tgt
SET c1 = NULL
WHERE NOT EXISTS
(
  SELECT *
  FROM src
  WHERE src.c2 = tgt.c2 =  AND src.c3 = 'P'
);

更新:您刚刚更改了问题,现在有两个不同的字段要在两种不同的情况下设置为null。我建议您只使用两个语句:上面针对c1,类似针对c4。不需要让事情变得比实际更复杂。