使用 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
我在使用 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