使用LEFT JOIN删除

Mat*_*att 22 sql postgresql join left-join

我想从表中删除取决于另一个引用第一个表的表上存在的数据,但是,我有代码可以工作并显示当我将其作为SELECT stetement运行时要删除的值,但是当我将其更改为删除它给了我错误,我不明白为什么他们在那里.

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;
Run Code Online (Sandbox Code Playgroud)

错误:

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
Run Code Online (Sandbox Code Playgroud)

我正在使用postgres

小智 53

样品.表'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
Run Code Online (Sandbox Code Playgroud)

  • 问题被标记为 postgresql,但 LEFT JOIN 对 postgresql 中的 DELETE 无效。 (7认同)
  • 这是有效的,这是标题的正确答案 (3认同)
  • 这在 postgres 中不起作用。为什么这个有这么多点赞? (2认同)

Lau*_* S. 16

从我看到的地方,你实际上并不需要联接来执行此操作......

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

它将使用以下客户ID删除leadcustomer中的所有记录:1)与8不同2)不在表格"R"或"H"的表格中

这不是你想要做的吗?

  • 这有效但不输入,不会使用 customerID 的索引(如果你有一个),这可能会很痛苦(检查这个 http://stackoverflow.com/questions/652770/delete-with-join-in 中的评论-mysql) (2认同)
  • 这是一个非常古老的问题,但没有人在答案中提到它(也许 PostgreSQL 当时没有提供),但如果您正在寻找性能,则 NOT EXISTS 是模拟左连接的更好选择,而不是 NOT IN。 (2认同)