PostgreSQL löschen mit innerem Join

197
DELETE B.* 
FROM   m_productprice B  
       INNER JOIN m_product C ON B.m_product_id = C.m_product_id 
WHERE  C.upc = '7094' AND B.m_pricelist_version_id = '1000020'

Ich erhalte den folgenden Fehler PostgreSQL 8.2.11

ERROR:  syntax error at or near "B"
LINE 1: DELETE B.* from m_productprice B  INNER JOIN m_product C ON ...

Ich habe versucht zu geben

DELETE B from m_productprice B  INNER JOIN m_product C ON B....
 ERROR:  syntax error at or near "B"

Ich habe versucht zu geben

ERROR:  syntax error at or near "INNER"
LINE 1: DELETE from m_productprice B  INNER JOIN m_product C ON B.m_...

Was ist das Problem mit meiner Anfrage?

Kumpel
quelle
3
8,2? Sie sollten so schnell wie möglich ein Upgrade durchführen. Diese Version wird nicht mehr unterstützt. Und bitte lesen Sie das Handbuch: INNER JOINFür die DELETE-Anweisung ist keine verfügbar: postgresql.org/docs/8.2/static/sql-delete.html
a_horse_with_no_name
Jede alternative Methode zum Ausführen dieser Abfrage ohne inneren Join
Typ
Siehe das Handbuch, dafür gibt es ein Beispiel.
a_horse_with_no_name

Antworten:

295
DELETE 
FROM m_productprice B  
     USING m_product C 
WHERE B.m_product_id = C.m_product_id AND
      C.upc = '7094' AND                 
      B.m_pricelist_version_id='1000020';

oder

DELETE 
FROM m_productprice
WHERE m_pricelist_version_id='1000020' AND 
      m_product_id IN (SELECT m_product_id 
                       FROM m_product 
                       WHERE upc = '7094'); 
Omesh
quelle
@ 0mesh es ist für MySQL .. mein Zweifel ist für SQL und Postgre SQL
Dude
14
Bei größeren Tabellen ist die erste Lösung in dieser Antwort möglicherweise viel schneller.
mgoldwasser
2
Die beste Antwort, insbesondere die erste, da Sie mehrere Felder abgleichen können.
Kostanos
57

Das hat bei mir funktioniert:

DELETE from m_productprice
WHERE  m_pricelist_version_id='1000020'
       AND m_product_id IN (SELECT m_product_id
                            FROM   m_product
                            WHERE  upc = '7094'); 
Kumpel
quelle
31

Ein anderes Formular, das mit Postgres 9.1+ funktioniert, ist das Kombinieren eines allgemeinen Tabellenausdrucks mit der USING-Anweisung für den Join.

WITH prod AS (select m_product_id, upc from m_product where upc='7094')
DELETE FROM m_productprice B
USING prod C
WHERE B.m_product_id = C.m_product_id 
AND B.m_pricelist_version_id = '1000020';
Robert Casey
quelle
26

Wenn Sie mehr als einen Join haben, können Sie durch Kommas getrennte USING-Anweisungen verwenden:

DELETE 
FROM 
      AAA AS a 
USING 
      BBB AS b,
      CCC AS c
WHERE 
      a.id = b.id 
  AND a.id = c.id
  AND a.uid = 12345 
  AND c.gid = 's434sd4'

Referenz

Mahesh
quelle
22

Verwenden Sie einfach eine Unterabfrage mit INNER JOIN, LEFT JOIN oder etwas anderem:

DELETE FROM m_productprice
WHERE m_product_id IN
(
  SELECT B.m_product_id
  FROM   m_productprice  B
    INNER JOIN m_product C 
    ON   B.m_product_id = C.m_product_id
  WHERE  C.upc = '7094' 
  AND    B.m_pricelist_version_id = '1000020'
)

um die Abfrage zu optimieren,

Ivan Rave
quelle