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 de guide (relations mortes).

Voici ce que je veux faire, mais ça ne marche 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

En raison des problèmes de locking de l’implémentation, MySQL ne permet pas de référencer la table concernée avec DELETE ou UPDATE .

Vous devez faire un JOIN ici à la place:

 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 ) 

Je pense que, 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 concernées, n’est-ce pas?

Essayez cet exemple de scripts SQL pour une compréhension aisée,

 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 

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 )