Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi les instructions NOT EXISTS doublement imbriquées sont-elles inévitables dans SQL

Votre question est la suivante :"Trouvez tous les composants qui sont/ont été expédiés à tous les projets dans une ville spécifique." Vous reformulez cela comme "Rechercher tous les composants où il n'y a pas de projet dans une ville donnée qui n'a pas le composant."

Je serais plus enclin à répondre directement :

select scp.component
from scp join
     projects p
     on scp.pnr = p.pnr
where p.city = 'Foobar Town'
group scp.component
having count(distinct scp.pnr) = (select count(distinct pnr)
                                  from projects
                                  where city = 'Foobar Town'
                                 );

Cela compte le nombre de projets distincts dans la ville et les compare au nombre de projets dans la ville (le distinct id probablement pas nécessaire dans la sous-requête.

Tout d'abord, je ne sais pas si c'est plus simple. Deuxièmement, je suis le premier à admettre que le NOT EXISTS méthode peut être plus efficace, bien que l'imbrication de NOT EXISTS dans les sous-requêtes peut nuire aux performances. Je pense cependant que c'est plus facile à suivre.