2017-07-24 57 views
0

我有3个表...SQL选择行,其中从链接表中的所有行具有在列中的相同值x

  • 检验(A)
  • Inspection_Vehicle(B)
  • Inspection_Vehicle_Defect(C)

我想从一个返回所有行时由C所有链接行中列有的值Checklist_Result_ID

表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行任何时候A.Inspection_ID = B.Inspection_ID AND B.Inspection_Vehicle_ID = 1001

但是,如果C.Create_Result_ID = 6在C中的所有链接行中,我希望这些记录。

+0

如果没有链接行,该怎么办? –

回答

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-一个性能杀手。

+0

我收到一个空查询结果集。 – Julian

+0

@Julian。 。 。我修复了查询。 –

0

你需要一个双重负向你需要什么,我只是做了速度“B-> C”的关系:

Select * 
from B 
where B.ID NOT in 
(
    Select * 
    from C 
    where checklist_result_id <> 6 
    and  c.id = b.id 
) 

这会给你B如果在C连接的行具有没有比“6”等价值,也将返回b,如果有在C.没有链接行

如果说的不对,你还需要做

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 
) 
相关问题