[英]How to select parent rows where all children statisfies a condition in SQL?
我有两个处于“一对多”关系的表。
TblProjects
ProjectID
.........
TblCustomers
ProjectID
Number
.........
如何获得所有 Customers
满足此条件的所有ProjectIDs
Number % 100 = 0
一个通用的解决方案是将NOT EXISTS
与相反的条件( <>
而不是=
)一起使用:
SELECT DISTINCT p.ProjectID
FROM TblProjects p INNER JOIN TblCustomers ct
ON ct.ProjectID = p.ProjectID
WHERE NOT EXISTS
(SELECT 1
FROM TblCustomers c
WHERE c.ProjectID = p.ProjectID AND (Number % 100) <> 0)
这是一个SQLFiddle 。
另外,针对此用例,您可以使用更简洁的查询:
SELECT p.ProjectID
FROM TblProjects p INNER JOIN TblCustomers ct
ON ct.ProjectID = p.ProjectID
GROUP BY p.ProjectID
HAVING MAX(ct.Number % 100) = 0
这是一个SQLFiddle 。
PS如果只需要ProjectID
,则根本不需要连接任何东西,只需直接使用TblCustomers
。
您可以只使用内部联接
Select * from tblProjects pro
inner join tblCustomers cst on pro.projectID = cst.ProjectID
and cst.Number % 100 = 0
它会给你你想要的
您可以使用CTE来获得可读的查询:
;with
not_all_at_100 as
( select distinct c.ProjectID
FROM TblCustomers c
WHERE (c.Number % 100) != 0
),
all_project_customers as
( select ProjectID
FROM TblCustomers
)
select distinct p.ProjectID
from TblProjects p
where p.ProjectID in ( select ProjectID from all_project_customers )
and p.ProjectID not in ( select ProjectID from not_all_at_100 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.