我有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。
答案 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