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 值进行更新的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle SQL 中查询不返回单行时更新

sql查询中有一列中有NULL的数据,如何判断不为空的时候才进行操作?

SQL 查询优化

sql查询的优化

提高SQL查询效率

提高sql查询效率