我有两个表是“一对多”的关系。如何选择所有孩子在SQL中确定条件的父行?
TblProjects
ProjectID
.........
TblCustomers
ProjectID
Number
.........
我怎样才能得到所有ProjectIDs
为此所有Customers
满足这个条件
Number % 100 = 0
我有两个表是“一对多”的关系。如何选择所有孩子在SQL中确定条件的父行?
TblProjects
ProjectID
.........
TblCustomers
ProjectID
Number
.........
我怎样才能得到所有ProjectIDs
为此所有Customers
满足这个条件
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。
P.S.如果你只有需要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)
有你尝试过的东西你自己? – Unlockedluca