SQL 查询正在使用 NULL 值进行更新
Posted
技术标签:
【中文标题】SQL 查询正在使用 NULL 值进行更新【英文标题】:SQL Query is updating with NULL values 【发布时间】:2016-01-28 13:26:04 【问题描述】:我正在使用 Oracle,我正在尝试使用另一个表 (B) 中的数据更新表 (A)。并非 B 中的每个字段都有一个值,所以我有许多 NULL 条目。当我运行更新时,它说更新了 6000 行。现在表 B 中有 6000 行,但是对于这个查询,只有 14 行有数据。当我从两个表中选择 count(*) 作为这个值时,它们都返回 14 行。为什么报告更新了 6000 行?
UPDATE
table1 A
SET
phone_work = (
SELECT B.phone_work
FROM table2 B
WHERE B.id = A.applicant_id)
WHERE EXISTS (
SELECT 1
FROM table2 B
WHERE B.id = A.applicant_id);
我也尝试了以下方法,得到了相同的结果:
UPDATE
table1 A
SET
phone_work = (
SELECT B.phone_work
FROM table2 B
WHERE B.id = A.applicant_id
AND B.phone_work is not null
)
WHERE EXISTS (
SELECT 1
FROM table2 B
WHERE B.id = A.applicant_id);
为什么报告更新了 6000 行?当我更改字段但使用相同的语法时,它会报告我期望的确切行数的更新,例如表 B 的计数在 NAME 字段中有 86 个条目,它报告更新了 86 行。似乎使用 phone_work 字段,我将每个空值都计为更新。
【问题讨论】:
你能添加一些示例表数据,这是预期的结果吗? 【参考方案1】:也许你想检查exists
中的非NULL值:
UPDATE table1 A
SET phone_work = (SELECT B.phone_work
FROM table2 B
WHERE B.id = A.applicant_id
)
WHERE EXISTS (SELECT 1
FROM table2 B
WHERE B.id = A.applicant_id AND B.phone_work IS NOT NULL
);
【讨论】:
谢谢,这已经奏效了。知道为什么它在 WHERE EXISTS 部分而不是第一个 SELECT 语句中需要这个吗? @HardLeeWorking 。 . .是的。WHERE
子句确定更新哪些行。 SET
语句确定在行中设置的值。【参考方案2】:
试试这个:
UPDATE
(
SELECT A.phone_work Aphone, B.phone_work Bphone
FROM table2 B, table1 A
WHERE B.id = A.applicant_id AND B.phone_work IS NOT NULL
)
SET
Aphone = Bphone;
来源:Oracle SQL: Update a table with data from another table
【讨论】:
以上是关于SQL 查询正在使用 NULL 值进行更新的主要内容,如果未能解决你的问题,请参考以下文章