包含左连接的 SQL Oracle 更新
Posted
技术标签:
【中文标题】包含左连接的 SQL Oracle 更新【英文标题】:SQL Oracle Update containing left join 【发布时间】:2020-06-19 03:58:55 【问题描述】:我想对选择查询的结果执行更新。
SELECT
a.reason,
n.note
FROM applications a
LEFT JOIN notes n on n.app_id = a.app_id
AND n.note LIKE '%old%'
WHERE a.code = 'run' AND a.reason IS NULL
我以为我可以单独执行这些更新,将选择包装在更新中,但是我收到错误 ORA-01733: virtual column not allowed here。我该如何执行这些更新?
UPDATE (
SELECT
a.reason AS Reason
FROM applications a
LEFT JOIN notes n on n.app_id = a.app_id
AND n.note LIKE '%old%'
WHERE a.code = 'run' AND a.reason IS NULL
) SET Reason = null
UPDATE (
SELECT
n.note AS Note
FROM applications a
LEFT JOIN notes n on n.app_id = a.app_id
AND n.note LIKE '%old%'
WHERE a.code = 'run' AND a.reason IS NULL
) SET Note = null
【问题讨论】:
【参考方案1】:您不能同时更新这两个表。您需要两个不同的更新语句,如下所示:
更新APPLICATIONS
表非常简单,因为APPLICATIONS
表中具有a.code = 'run' AND a.reason IS NULL
的所有记录都将在您的SELECT
查询中。
UPDATE APPLICATIONS A
SET
REASON = NULL
WHERE A.CODE = 'run'
AND A.REASON IS NULL;
要更新NOTES
表,可以使用EXISTS
子句,如下所示:
UPDATE NOTES N
SET
NOTE = NULL
WHERE EXISTS (
SELECT 1
FROM APPLICATIONS A
WHERE N.APP_ID = A.APP_ID
AND A.CODE = 'run'
AND A.REASON IS NULL
)
AND N.NOTE LIKE '%old%'
您必须先更新NOTES
表,然后再更新APPLICATIONS
表,因为在更新NOTES
表时,您正在使用条件A. REASON IS NULL
,但在更新APPLICATIONS
表时,您正在更新REASON
列。
【讨论】:
以上是关于包含左连接的 SQL Oracle 更新的主要内容,如果未能解决你的问题,请参考以下文章
我在 oracle sql 中的左连接没有返回左表的每个元素
当我们在 select 中有 case 语句时,使用左外连接进行 Oracle 更新