我有兩個表是「一對多」的關係。如何選擇所有孩子在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