Suppression de PostgreSQL avec jointure interne

198
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'

je reçois l'erreur suivante 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 ...

j'ai essayé de donner

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

j'ai essayé de donner

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

quel est le problème avec ma requête?

mec
la source
3
8.2? Vous devez mettre à niveau dès que possible. Cette version n'est plus prise en charge. Et veuillez lire le manuel: il n'y a pas de INNER JOINdisponible pour l'instruction DELETE: postgresql.org/docs/8.2/static/sql-delete.html
a_horse_with_no_name
toute autre méthode pour exécuter cette requête sans jointure interne
mec
Voir le manuel, il y a un exemple pour exactement cela.
a_horse_with_no_name

Réponses:

297
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';

ou

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
la source
@ 0mesh son pour mysql .. mon doute est pour sql et postgre sql
mec
14
pour les tables plus grandes, la première solution de cette réponse est potentiellement beaucoup plus rapide.
mgoldwasser
2
La meilleure réponse, en particulier la première, car elle vous permet de faire correspondre plusieurs champs.
Kostanos
57

Cela a fonctionné pour moi:

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'); 
mec
la source
31

Un autre formulaire qui fonctionne avec Postgres 9.1+ combine une expression de table commune avec l'instruction USING pour la jointure.

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
la source
26

Si vous avez plusieurs jointures, vous pouvez utiliser des instructions USING séparées par des virgules:

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'

Référence

Mahesh
la source
22

Utilisez simplement une sous-requête avec INNER JOIN, LEFT JOIN ou smth else:

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'
)

pour optimiser la requête,

  • utilisez NOT EXISTS au lieu deIN
  • et AVEC pour les grandes sous-requêtes
Ivan Rave
la source