使用 where exists 子句更新多个值

Posted

技术标签:

【中文标题】使用 where exists 子句更新多个值【英文标题】:Update multiple values with where exists clause 【发布时间】:2016-06-30 14:09:31 【问题描述】:

我有这个关于 PL/SQL 的问题。 我有 2 个具有相同列的表。 一个用于当前运行,另一个用于历史记录。

每次运行时,我都需要仅使用在当前运行中找到的值来更新历史记录。

当前表

|   ID  |__NAME__|__SURNAME__|__CITY__|
| 10000 |  ABC   |   CDE     |   IT   |
| 10001 |  EFG   |   ASD     |   EN   |
| 10005 |        |           |        |

历史表

|   ID  |__NAME__|__SURNAME__|__CITY__|
| 10000 |  FFF   |    AAA    |   EN   |
| 10001 |  DDD   |    BBB    |   GR   |
| 10005 |  JKO   |    POI    |   GR   |
| 10006 |  DLK   |    MIN    |   IT   |

如您所见,Current Table 有一条记录,其中除了 ID=10005 之外的所有值都是空的。 所以,我需要从当前表中更新历史记录(名字、姓氏、城市),其中 id 存在于当前表中,并且名字、姓氏和城市不为空。

我试过了

UPDATE HISTORY
    SET (NAME, SURNAME, CITY) = (
        SELECT NAME, SURNAME, CITY
        FROM CURRENT temp
        WHERE temp.name is not null and temp.id = history.id
        )
    WHERE exists (
        SELECT NAME, SURNAME, CITY
        FROM CURRENT temp
        WHERE temp.name is not null and temp.id = history.id
    );

但它不起作用。 需要强调的是,当当前表中name为null时,surname和city也为null。

【问题讨论】:

你使用的是 mysql 还是 Postgres? PLSQL- 我要编辑我的问题 你的意思是Oracle SQL吗? 【参考方案1】:

实际上,您的查询中唯一错误的是表 CURRENT 的名称。它是oracle 中的保留字,不建议将其用作表名。你必须使用“”这个才能工作。这里:

UPDATE HISTORY
    SET (NAME, SURNAME, CITY) = (
        SELECT NAME, SURNAME, CITY
        FROM "CURRENT" temp
        WHERE temp.name is not null and temp.id = history.id
        )
    WHERE exists (
        SELECT NAME, SURNAME, CITY
        FROM "CURRENT" temp
        WHERE temp.name is not null and temp.id = history.id
    );

您也可以使用MERGE(请参阅两者的解释计划):

MERGE INTO HISTORY_TABLE a
     USING (SELECT ID, NAME, SURNAME, CITY
              FROM CURRENT_TABLE
             WHERE NAME IS NOT NULL) b
        ON (a.id = b.id)
WHEN MATCHED THEN
   UPDATE SET a.NAME = b.NAME, a.SURNAME = b.SURNAME, a.CITY = b.CITY

【讨论】:

以上是关于使用 where exists 子句更新多个值的主要内容,如果未能解决你的问题,请参考以下文章

使用一个 WHERE 子句更新多个表

使用 MS Access 如何使用多个连接和 where 子句执行更新?

SQL Server查询表值参数的短路EXISTS语句

使用多个 WHERE 子句更新 Codeigniter 中的批处理

通过 FETCH NEXT 子句加速 WHERE EXISTS 子句

IF EXISTS 在 WHERE 子句中