繁体   English   中英

如何选择所有子级都满足SQL条件的父级行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM