我有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;
除了我只想要 ALL 时的结果,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 <时,我不想要来自A的任何行em> B.Inspection_Vehicle_ID = 1001
但是如果C中所有链接行中的C.Checklist_Result_ID = 6,我想要那些记录。
答案 0 :(得分:0)
你需要一个双阴影来做你需要的,我刚刚完成'B-&gt; 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
)
答案 1 :(得分:0)
我会这样做:
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
- 一个性能杀手。