包含左联接的SQL Oracle更新
我想对select查询的结果执行更新包含左联接的SQL Oracle更新,sql,oracle,sql-update,left-join,Sql,Oracle,Sql Update,Left Join,我想对select查询的结果执行更新 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 我想我可以单独执行这些更新,在更新中包装select,但是我得到错误ORA-01733:此处不允许虚拟列。如何执行这些更新 UPDAT
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
我想我可以单独执行这些更新,在更新中包装select,但是我得到错误ORA-01733:此处不允许虚拟列。如何执行这些更新
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
不能同时更新这两个表。您需要两个不同的update语句,如下所示:
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%'
更新应用程序
表非常容易,因为应用程序
表中具有a.code='run'和a.reason为NULL的所有记录都将出现在选择
查询中
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一样。原因为空
但在更新APPLICATIONS
表时,您正在更新原因
列