使用 LEFT JOIN 删除

Posted

技术标签:

【中文标题】使用 LEFT JOIN 删除【英文标题】:Deleting using 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 ...” 【参考方案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 的索引(如果你有的话),这可能会很痛苦(检查这个 ***.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

以上是关于使用 LEFT JOIN 删除的主要内容,如果未能解决你的问题,请参考以下文章

从 LEFT JOIN 查询中删除重复项

sql 删除LEFT JOIN

从 LEFT OUTER JOIN 中删除重复项

MySQL Left join 无法在单个查询中删除重复项

Postgresql LEFT JOIN json_agg() 忽略/删除 NULL

LEFT JOIN FETCH 不起作用 - Spring 数据 JPA