Ihre Frage lautet:"Finden Sie alle Komponenten, die an alle Projekte in einer bestimmten Stadt geliefert werden/wurden." Sie formulieren dies um in "Finde alle Komponenten, bei denen es kein Projekt in einer bestimmten Stadt gibt, das die Komponente nicht hat."
Ich wäre eher geneigt, dies direkt zu beantworten:
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'
);
Dieser zählt die Anzahl der unterschiedlichen Projekte in der Stadt und vergleicht sie mit der Anzahl der Projekte in der Stadt (der distinct
id ist in der Unterabfrage wahrscheinlich nicht erforderlich.
Erstens bin ich mir nicht sicher, ob dies einfacher ist. Zweitens bin ich der Erste, der zugibt, dass der NOT EXISTS
Methode kann effizienter sein, obwohl die Verschachtelung von NOT EXISTS
in Unterabfragen kann die Leistung beeinträchtigen. Ich denke jedoch, dass dies einfacher zu befolgen ist.