簡體   English   中英

SQL選擇鏈接表中所有行在x列中具有相同值的行

[英]SQL Select rows where all rows from linked table have the same value in column x

我有3張桌子...

  • 檢查(A)
  • 檢驗車輛(B)
  • 檢驗_車輛_缺陷(C)

當所有來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM