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
Avez-vous essayé d'utiliser EXPLAIN pour déterminer ce que chaque demande fait? –
Avez-vous juste essayé si cela fonctionne? Ça ne me semble pas si mal. – Bobby
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