使用 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 子句更新多个值的主要内容,如果未能解决你的问题,请参考以下文章
使用 MS Access 如何使用多个连接和 where 子句执行更新?
使用多个 WHERE 子句更新 Codeigniter 中的批处理