2017-07-24 59 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 
) 
相關問題