70 votes

SQL DELETE avec JOIN une autre table pour la condition WHERE

Je dois supprimer les lignes de guide_category qui n'ont aucune relation avec la table guide (relations mortes).

Voici ce que je veux faire, mais cela ne fonctionne bien sûr pas.

 DELETE FROM guide_category AS pgc 
 WHERE pgc.id_guide_category IN (SELECT id_guide_category 
                                   FROM guide_category AS gc
                              LEFT JOIN guide AS g ON g.id_guide = gc.id_guide
                                  WHERE g.title IS NULL)
 

Erreur:

Vous ne pouvez pas spécifier la table cible 'guide_category' pour la mise à jour dans la clause FROM

106voto

Quassnoi Points 191041

En raison des problèmes de verrouillage de la mise en œuvre, MySQL ne permet pas de référencer la table affectée avec DELETE ou UPDATE .

Vous devez faire un JOIN ici:

 DELETE  gc.*
FROM    guide_category AS gc 
LEFT JOIN
        guide AS g 
ON      g.id_guide = gc.id_guide
WHERE   g.title IS NULL
 

ou utilisez simplement un NOT IN :

 DELETE  
FROM    guide_category AS gc 
WHERE   id_guide NOT IN
        (
        SELECT  id_guide
        FROM    guide
        )
 

9voto

Dirk Points 17809

Je pense, d'après votre description, ce qui suit suffirait:

 DELETE FROM guide_category 
WHERE id_guide NOT IN (SELECT id_guide FROM guide)
 

Je suppose qu'il n'y a pas de contraintes d'intégrité référentielle sur les tables impliquées, n'est-ce pas?

4voto

user2384628 Points 1

Essayez cet exemple de scripts SQL pour faciliter la compréhension.

 CREATE TABLE TABLE1 (REFNO VARCHAR(10))
CREATE TABLE TABLE2 (REFNO VARCHAR(10))

--TRUNCATE TABLE TABLE1
--TRUNCATE TABLE TABLE2

INSERT INTO TABLE1 SELECT 'TEST_NAME'
INSERT INTO TABLE1 SELECT 'KUMAR'
INSERT INTO TABLE1 SELECT 'SIVA'
INSERT INTO TABLE1 SELECT 'SUSHANT'

INSERT INTO TABLE2 SELECT 'KUMAR'
INSERT INTO TABLE2 SELECT 'SIVA'
INSERT INTO TABLE2 SELECT 'SUSHANT'

SELECT * FROM TABLE1
SELECT * FROM TABLE2

DELETE T1 FROM TABLE1 T1 JOIN TABLE2 T2 ON T1.REFNO = T2.REFNO
 

Votre cas est:

    DELETE pgc
     FROM guide_category pgc 
LEFT JOIN guide g
       ON g.id_guide = gc.id_guide 
    WHERE g.id_guide IS NULL
 

-3voto

Philippe Leybaert Points 62715

Que diriez-vous:

 DELETE guide_category  
  WHERE id_guide_category IN ( 

        SELECT id_guide_category 
          FROM guide_category AS gc
     LEFT JOIN guide AS g 
            ON g.id_guide = gc.id_guide
         WHERE g.title IS NULL

  )
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X