La tua domanda è:"Trova tutti i componenti che sono stati spediti a tutti i progetti in una città specifica". Lo stai riformulando come "Trova tutti i componenti in cui non esiste alcun progetto in una determinata città che non abbia il componente".
Sarei più propenso a rispondere direttamente a questo:
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'
);
Questo conta il numero di progetti distinti nella città e li confronta con il numero di progetti nella città (il distinct
id probabilmente non è necessario nella sottoquery.
Innanzitutto, non sono sicuro che sia più semplice. Secondo, sono il primo ad ammettere che il NOT EXISTS
metodo può essere più efficiente, sebbene l'annidamento di NOT EXISTS
nelle sottoquery può essere dannoso per le prestazioni. Tuttavia, penso che questo sia più facile da seguire.