【问题标题】:Deleting using LEFT JOIN使用 LEFT JOIN 删除
【发布时间】:2013-03-09 10:52:53
【问题描述】:

我想根据另一个表中存在的引用第一个表的数据从表中删除,但是,当我将其作为 SELECT 语句运行时,我的代码可以工作并显示要删除的值,但是当我将其更改为 DELETE 它会给我错误,我不明白它们为什么在那里。

DELETE leadCustomer.* FROM coursework.leadCustomer LEFT JOIN coursework.flightBooking
ON leadCustomer.customerID = flightBooking.customerID
WHERE leadCustomer.customerID NOT IN (
SELECT customerID FROM (SELECT customerID, status FROM coursework.flightBooking) AS
StatusCount where status IN  ('R','H') GROUP BY customerID
)
AND leadCustomer.customerID = 8;

错误:

ERROR:  syntax error at or near "leadCustomer"
LINE 1: DELETE leadCustomer.* FROM coursework.leadCustomer LEFT JOIN...
               ^

********** Error **********

ERROR: syntax error at or near "leadCustomer"
SQL state: 42601
Character: 8

我正在使用 postgres

【问题讨论】:

  • 使用delete from table where id in (your select query)
  • 删除 .* 并设置 DELETE loadCustomer FROM ....
  • 试试这个:“删除leadCustomer FROM ...”

标签: sql postgresql join left-join


【解决方案1】:

示例。删除表“A”中的记录 表“H”中没有记录

DELETE A FROM ARTICULO_ALMACEN A
LEFT JOIN HISTORICO_UNION H
ON A.COD_ARTICULO = H.COD_ARTICULO
AND A.COD_ALMACEN = H.COD_ARTICULO_ALMACEN
AND A.TPROPIEDAD1 = H.PROPIEDAD1
AND A.TPROPIEDAD2 = H.PROPIEDAD2
AND A.TPROPIEDAD3 = H.PROPIEDAD3
WHERE H.COD_ARTICULO IS NULL

【讨论】:

  • 这行得通,这是标题的正确答案
  • 问题被标记为 postgresql 但 LEFT JOIN 在 postgresql 中与 DELETE 无效。
  • 当连接条件中有更多的棕褐色一列时,此选项很有用。 “不在”在这些情况下不起作用。 “where not exists(select...)”也可以使用,但我认为这个答案更优雅。
  • 错误:“A”处或附近的语法错误第 1 行:从 ARTICULO_ALMACEN A 中删除 A
  • 这在 postgres 中不起作用。为什么会有这么多赞?
【解决方案2】:

在我看来,您实际上并不需要加入来执行此操作...

DELETE FROM coursework.leadCustomer 
WHERE leadCustomer.customerID NOT IN (
SELECT distinct customerID FROM coursework.flightBooking  where status IN  ('R','H') 
)
AND leadCustomer.customerID = 8;

它将删除leadcustomer 中customerID 为:的所有记录: 1) 不同于 8 2) 不在表航班预订中,状态为“R”或“H”

这不是你想要做的吗?

【讨论】:

  • 你说得对,我不需要加入。并且该中间行的整理也有效,但是它的作用是给定一个 ID,如果它没有状态为 R 或 H 的相关预订,它将删除该行
  • 这有效,但不是 IN,不会使用 customerID 的索引(如果你有的话),这可能会很痛苦(检查这个 stackoverflow.com/questions/652770/delete-with-join-in-mysql 中的评论)
  • 这是一个非常古老的问题,但没有人在答案中提到它(也许 PostgreSQL 当时没有提供)但如果你模拟左连接,NOT EXISTS 是比 NOT IN 更好的选择'正在寻找性能。
【解决方案3】:

您需要这样做:

从表 A 中删除 身份证在哪里 (从tableA中选择ID a a.ID = b.ID 上的左外连接表 B b 其中 b.ID 为 NULL)

【讨论】:

    【解决方案4】:

    leadCustomer.* 中删除.* 即:

    DELETE leadCustomer FROM coursework.leadCustomer LEFT JOIN coursework.flightBooking
    ON leadCustomer.customerID = flightBooking.customerID
    WHERE leadCustomer.customerID NOT IN (
    SELECT customerID FROM (SELECT customerID, status FROM coursework.flightBooking) AS
    StatusCount where status IN  ('R','H') GROUP BY customerID
    )
    AND leadCustomer.customerID = 8;
    

    【讨论】:

    • PostgreSQL 不支持引用DELETELEFT JOIN
    【解决方案5】:

    你可以试试这个

     DELETE leadCustomer FROM coursework.leadCustomer lc
     LEFT JOIN coursework.flightBooking fb ON lc.customerID = fb.customerID 
     and status IN  ('R','H')and fb.customer_id is not null
     WHERE  leadCustomer.customerID = 8;
    

    【讨论】:

    • 我相信,基于documentation,这里的LEFT JOIN会导致语法错误。
    • PostgreSQL 不支持引用DELETELEFT JOIN
    猜你喜欢
    • 2011-02-15
    • 2021-07-12
    • 1970-01-01
    • 2014-08-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 2016-05-28
    相关资源
    最近更新 更多