2010-07-27 6 views
1

J'ai une requête.améliorer une requête mysql

DELETE FROM A 
WHERE i NOT IN 
(SELECT i FROM B WHERE j = 1 
    UNION select i from C 
    UNION select i from D 
); 

supprimer toutes les lignes de fond Un champ où i ne se produit pas dans les tableaux B, C ou D. Si c'était juste:

DELETE FROM A 
WHERE i NOT IN 
(SELECT i FROM B 
); 

Ensuite, cela peut se faire facilement avec une jointure gauche

DELETE A FROM A 
LEFT JOIN B 
ON A.i = B.i 
WHERE B.id is NULL; 

(Supposons que chaque table a un champ id dans le schéma)

I gu Essais ma question est-ce que ce qui précède s'applique à le scénario à trois tables avec la solution suivante?

DELETE A FROM A 
LEFT JOIN B 
ON A.i = B.i AND B.j = 1 
LEFT JOIN C 
ON A.i = C.i 
LEFT JOIN D 
ON A.i = D.i 
WHERE B.id is NULL 
AND C.id is NULL 
AND D.id is NULL 
+0

Avez-vous essayé d'utiliser EXPLAIN pour déterminer ce que chaque demande fait? –

+0

Avez-vous juste essayé si cela fonctionne? Ça ne me semble pas si mal. – Bobby

+0

Il s'exécute et fonctionne et semble faire ce qu'il devrait faire. Maintenant, après avoir passé un peu plus de temps avec ça, je me sens plus à l'aise. Il exécute également un ordre de grandeur plus rapide que le code interne de sélection/union. – bradgonesurfing

Répondre

2

Quelque chose comme ceci:

DELETE 
    FROM A 
WHERE NOT EXISTS (
        SELECT * 
        FROM B 
        WHERE B.i = A.i 
       ) 
     AND NOT EXISTS (
         SELECT * 
         FROM C 
         WHERE C.i = A.i 
        ) 
     AND NOT EXISTS (
         SELECT * 
         FROM D 
         WHERE D.i = A.i 
        ); 
+0

C'est généralement toujours une mauvaise idée dans mon expérience. Les sélections intérieures où l'une des conditions dépend de la table externe sont très lentes. – bradgonesurfing

+0

@bradgonesurfing: vous n'avez pas publié de schéma ni de données, donc je ne peux pas le tester. Avez-vous...? – onedaywhen

+0

N'est-ce pas un schéma explicatif? Chaque table a deux champs id - clé primaire i - entier – bradgonesurfing

Questions connexes