包含左连接的 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左连接

我在 oracle sql 中的左连接没有返回左表的每个元素

当我们在 select 中有 case 语句时,使用左外连接进行 Oracle 更新

SQL中的左连接与右连接,内连接有啥区别

两个左连接SQL执行计划解析(Oracle和PGSQL对比):

Oracle左连接右连接全外连接以及(+)号用法