用多个条件下其他表的数据更新表?



我有一个名为A的表,它有ARTICLE_NUMBERNEWCOLUMN列。此外,我还有另一个名为B的表,其中包含articleenumber和EVENT列。我想为我的NEWCOLUMN列执行一个更新语句。

如果表B中的EVENTNULL,我的NEWCOLUMN列应该是0,如果表B中的EVENTNOT 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;
有谁能帮帮我吗?

我怀疑您真的想要EXISTS—即在表A中设置所有值,如果存在非NULL匹配事件,则使用1。那就是:

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中的ARTICLENUMBERs。

Oracle不支持这种mysql风格的update join语法。但是,您可以使用相关子查询来表示更新:

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);

与往常一样,请确保您有适当的索引。

相关内容

  • 没有找到相关文章

最新更新