【问题标题】:How to delete a record using inner join on Oracle SQL?如何在 Oracle SQL 上使用内部联接删除记录?
【发布时间】:2017-05-08 05:04:57
【问题描述】:

我有 3 张桌子

表 A:

| id_A | Data ... |

表 B:

| id_B | Data ... |

加入 A_B​​p>

| id_A | id_B |

这些表是我的情况的一个例子。好吧,我正在尝试从 Join A_B 中删除许多记录,具体取决于许多条件,例如 A 的名称是 X,B 的名称是 Y。

当我执行 SELECT 时它可以工作,但使用 DELETE 就不行了。

这是我的要求:

DELETE A_B FROM A 
INNER JOIN A_B 
  ON (A.ID = A_B.A_ID) 
INNER JOIN B 
  ON (B.ID = A_B.B_ID) 
WHERE B.NAME IN ('X', 'Y') 
AND A.NAME = 'Z';

上面写着:

Erreur SQL : ORA-00933: SQL command not properly ended
00933. 00000 -  "SQL command not properly ended"

【问题讨论】:

  • 你想删除,而不是删除 x FROM

标签: sql oracle inner-join


【解决方案1】:

试试:

delete from A
where A.ID in
    (
    select A_ID
    from A_B
    inner join B
      on B.ID = A_B.B_ID
    where B.NAME in (...)
    )
and A.NAME = 'Z'

【讨论】:

    【解决方案2】:

    你可以试试merge

    merge into A
    using (select * from A_B inner join B on (B.ID = A_B.B_ID) where B.NAME IN ('X', 'Y')) d
    on (d.A_ID = A.ID)
    when matched then delete where A.NAME = 'Z';
    

    【讨论】:

      【解决方案3】:

      执行删除时只允许一个 From 表。 试试

      DELETE FROM A_B 
      WHERE EXISTS (SELECT 1 FROM A 
        INNER JOIN B ON (B.ID = A_B.B_ID) 
        WHERE A.ID = A_B.A_ID
        AND B.NAME IN ('X', 'Y') 
        AND A.NAME = 'Z');
      

      参考here

      【讨论】:

        猜你喜欢
        • 2016-10-21
        • 2021-09-09
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-20
        • 1970-01-01
        相关资源
        最近更新 更多