使用 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 不支持引用DELETE
的LEFT 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 不支持引用DELETE
的LEFT JOIN
。以上是关于使用 LEFT JOIN 删除的主要内容,如果未能解决你的问题,请参考以下文章