首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Update使用子查询和Case语句

Update使用子查询和Case语句
EN

Stack Overflow用户
提问于 2017-02-20 20:07:54
回答 2查看 3.5K关注 0票数 0

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

以下是查询:

代码语言:javascript
复制
 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。

提前感谢您的帮助。

EN

回答 2

Stack Overflow用户

发布于 2017-02-20 20:20:12

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

代码语言:javascript
复制
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);

注意:以上操作将更新所有行。如果只想更新不匹配的行,那么在where子句中使用not exists

代码语言:javascript
复制
UPDATE TGT
    SET C1 = NULL
    WHERE NOT EXISTS (SELECT 1
                      FROM SRC
                      WHERE TGT.c2 = SRC.c2 AND SRC.C3 = 'P'
                     );
票数 2
EN

Stack Overflow用户

发布于 2017-02-20 20:38:19

您希望在src中不存在相关的'P‘记录的情况下设置c1 null。因此,请使用NOT EXISTS

代码语言:javascript
复制
UPDATE tgt
SET c1 = NULL
WHERE NOT EXISTS
(
  SELECT *
  FROM src
  WHERE src.c2 = tgt.c2 =  AND src.c3 = 'P'
);

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42344199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档