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.