使用where子句更新多个值

时间:2016-06-30 14:09:32

标签: plsql where-clause

我有PL / SQL的这个问题。 我有2个具有相同列的表。 一个是Current Run,另一个是历史。

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

当前表格

|   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   |

如您所见,当前表包含除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。

1 个答案:

答案 0 :(得分: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