我有一个名为A
的表,它有ARTICLE_NUMBER
和NEWCOLUMN
列。此外,我还有另一个名为B
的表,其中包含articleenumber和EVENT
列。我想为我的NEWCOLUMN
列执行一个更新语句。
如果表B
中的EVENT
是NULL
,我的NEWCOLUMN
列应该是0
,如果表B
中的EVENT
是NOT 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
中的ARTICLENUMBER
s。
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);
与往常一样,请确保您有适当的索引。