在多个条件下使用来自其他 table 的数据更新 table?

Update a table with data from other table with multiple conditions?

我有一个名为 A 的 table,它有 ARTICLE_NUMBERNEWCOLUMN 列。另外,我还有另一个名为 B 的 table,它有 ARTICLENUMBER 和 EVENT 列。我想为我的 NEWCOLUMN 列执行更新语句。

如果 Table BEVENTNULL,我的 NEWCOLUMN 列应该是 0,如果 EVENT在 Table BNOT NULL,我的 NEWCOLUMN 列应该是 1.

我尝试了以下方法,但不幸的是它没有用;

UPDATE A a
INNER JOIN B b 
    ON a.ARTICLENUMBER = b.ARTICLENUMBER
SET
    a.NEWCOLUMN = CASE WHEN b.EVENT IS NULL THEN 0
                       WHEN b.EVENT IS NOT NULL THEN 1
                  END;

有人可以帮助我吗?

Oracle 不支持这种 MySQL 风格的更新连接语法。但是,您可以使用相关子查询来表达您的更新:

UPDATE A a
SET NULLBESTAND = (SELECT CASE WHEN b.EVENT IS NULL THEN 0 ELSE 1 END
                   FROM B b
                   WHERE b.ARTICLENUMBER = a.ARTICLENUMBER);

我想是这样的:

update a set a.newcolumn = 
  (select case when b.event is null then 0
               when b.event is not null then 1
          end
   from b
   where b.article_number = a.article_number)
where exists (select null from b
              where b.article_number = a.article_number);

或合并:

merge into a
  using b
  on (a.article_number = b.article_number)
  when matched then update set
    a.newcolumn = case when b.event is null then 0
                       when b.event is not null then 1
                  end;

你可以有两个更新。

UPDATE A
SET NEWCOLUMN = 0
WHERE ARTICLENUMBER IN (select ARTICLENUMBER from B where EVENT IS NULL);
UPDATE A
SET NEWCOLUMN = 1
WHERE ARTICLENUMBER IN (select ARTICLENUMBER from B where EVENT IS NOT NULL);

一如既往,确保你有正确的索引。

我怀疑你真的想要EXISTS——也就是在tableA中设置所有值,用1 如果有非 NULL 匹配事件。那将是:

UPDATE A
    SET NEWCOLUMN = (CASE WHEN EXISTS (SELECT 1
                                       FROM B
                                       WHERE b.ARTICLENUMBER = a.ARTICLENUMBER AND
                                             b.EVENT IS NOT NULL
                                        )
                          THEN 1 ELSE 0
                      END);

请注意,这会更新 A 中的 所有 行——即使是那些在 B 中没有匹配文章的行。正如我所说,我 认为 这就是你想要做的,尽管这不是你的问题的确切措辞。您的问题没有具体说明如何处理不在 B.

中的 ARTICLENUMBER