[英]SQL Select rows where all rows from linked table have the same value in column x
我有3張桌子...
當所有來自C的鏈接行的Checklist_Result_ID列中的值為6時 ,我想返回A的所有行
表C包含鏈接到表B的列-Inspection_Vehicle_ID。 表B包含鏈接到表A-Inspection_ID的列。
我想做這樣的事情:
SELECT DISTINCT A.* FROM Inspection AS A
LEFT JOIN Inspection_Vehicle AS B ON B.Inspection_ID = A.Inspection_ID
LEFT JOIN Inspection_Vehicle_Defect AS C ON C.Inspection_Vehicle_ID = B.Inspection_Vehicle_ID
WHERE C.Checklist_Result_ID = 6;
除了我僅在C中所有鏈接的行都具有C.Checklist_Result_ID = 6時才需要結果。
例如,當表C具有以下行時:
ID Inspection_Vehicle_ID Checklist_Result_ID
5 1001 6
6 1001 6
7 1001 6
8 1001 5
...然后,當A.Inspection_ID = B.Inspection_ID AND B.Inspection_Vehicle_ID = 1001時,我不希望A中有任何行
但是,如果C中所有鏈接行中的C.Checklist_Result_ID = 6,我都需要這些記錄。
您需要使用雙負數來執行所需的操作,為了提高速度,我剛剛完成了'B-> C'關系:
Select *
from B
where B.ID NOT in
(
Select *
from C
where checklist_result_id <> 6
and c.id = b.id
)
如果C中的鏈接行除了'6'以外沒有其他值,這將為您提供B,但是如果C中沒有鏈接的行也將返回B。
如果那是錯誤的,您還需要做
Select *
from B
where B.ID NOT in
(
Select ID
from C
where checklist_result_id <> 6
and c.id = b.id
)
and B.ID in
(
Select ID
from C
where c.id = b.id
)
我將其作為:
SELECT i.*
FROM Inspection i JOIN
(SELECT iv.Inspection_ID
FROM Inspection_Vehicle iv JOIN
Inspection_Vehicle_Defect ivd
ON ivd.Inspection_Vehicle_ID = iv.Inspection_Vehicle_ID
GROUP BY iv.Inspection_ID
HAVING COUNT(*) = SUM(CASE WHEN ivd.Checklist_Result_ID = 6 THEN 1 ELSE 0 END)
) ivd
ON ivd.Inspection_ID = i.Inspection_ID;
這一點很重要,它消除了SELECT DISTINCT
—性能殺手。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.