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.