Câu hỏi của bạn là:"Tìm tất cả các thành phần đã / được vận chuyển đến tất cả các dự án trong một thành phố cụ thể." Bạn đang diễn đạt lại điều này là "Tìm tất cả các thành phần không có dự án nào trong một thành phố nhất định không có thành phần đó."
Tôi muốn trả lời trực tiếp vấn đề này hơn:
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'
);
Điều này đếm số lượng các dự án riêng biệt trong thành phố và so sánh chúng với số lượng các dự án trong thành phố (distinct
id có lẽ không cần thiết trong truy vấn con.
Đầu tiên, tôi không chắc liệu điều này có đơn giản hơn không. Thứ hai, tôi là người đầu tiên thừa nhận rằng NOT EXISTS
phương pháp may hiệu quả hơn, mặc dù việc lồng NOT EXISTS
trong các truy vấn con có thể gây bất lợi cho hiệu suất. Tuy nhiên, tôi nghĩ rằng điều này dễ thực hiện hơn.