Twoje pytanie brzmi:„Znajdź wszystkie komponenty, które zostały/zostały wysłane do wszystkich projektów w jednym konkretnym mieście”. Przeformułujesz to jako „Znajdź wszystkie komponenty, w których nie ma projektu w danym mieście, który nie ma komponentu”.
Chętnie odpowiem na to bezpośrednio:
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'
);
Liczy liczbę odrębnych projektów w mieście i porównuje je z liczbą projektów w mieście (distinct
id prawdopodobnie nie jest konieczne w podzapytaniu.
Po pierwsze, nie jestem pewien, czy to jest prostsze. Po drugie, jako pierwszy przyznaję, że NOT EXISTS
metoda może być bardziej wydajne, chociaż zagnieżdżenie NOT EXISTS
w podzapytaniach może mieć negatywny wpływ na wydajność. Myślę jednak, że jest to łatwiejsze do naśladowania.