Вашият въпрос е:"Намерете всички компоненти, които са/са били доставени до всички проекти в един конкретен град." Вие префразирате това като "Намерете всички компоненти, където няма проект в даден град, който да няма компонент."
Бих бил по-склонен да отговоря директно на това:
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'
);
Това отчита броя на отделните проекти в града и ги сравнява с броя на проектите в града (distinct
идентификатор вероятно не е необходим в подзаявката.
Първо, не съм сигурен дали това е по-просто. Второ, аз съм първият, който признава, че NOT EXISTS
метод може бъде по-ефективен, въпреки че влагането на NOT EXISTS
в подзаявки може да бъде пагубно за производителността. Мисля обаче, че това е по-лесно за следване.