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?


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

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

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

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.