在多个条件下使用来自其他 table 的数据更新 table?
Update a table with data from other table with multiple conditions?
我有一个名为 A
的 table,它有 ARTICLE_NUMBER
和 NEWCOLUMN
列。另外,我还有另一个名为 B
的 table,它有 ARTICLENUMBER 和 EVENT
列。我想为我的 NEWCOLUMN
列执行更新语句。
如果 Table B
的 EVENT
是 NULL
,我的 NEWCOLUMN
列应该是 0
,如果 EVENT
在 Table B
是 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;
有人可以帮助我吗?
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
我有一个名为 A
的 table,它有 ARTICLE_NUMBER
和 NEWCOLUMN
列。另外,我还有另一个名为 B
的 table,它有 ARTICLENUMBER 和 EVENT
列。我想为我的 NEWCOLUMN
列执行更新语句。
如果 Table B
的 EVENT
是 NULL
,我的 NEWCOLUMN
列应该是 0
,如果 EVENT
在 Table B
是 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;
有人可以帮助我吗?
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