使用 where exists 子句更新多个值

Update multiple values with where exists clause

我在使用 PL/SQL 时遇到了这个问题。 我有 2 个 tables 具有相同的 columnus。 一个用于当前 运行,另一个用于历史。

在每个 运行,我需要使用我在当前 运行.

中找到的值更新历史记录

当前Table

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

历史Table

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

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

我试过

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 在当前 table 中为 null 时,surname 和 city 也为 null。

实际上,您的查询中唯一错误的地方是 table CURRENT 的名称。是oracle中的保留字,不推荐作为table名称使用。你必须使用“”这个才能工作。这里:

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