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

时间:2017-07-24 12:49:12

标签: sql

我有3张桌子......

  • 检查(A)
  • Inspection_Vehicle(B)
  • Inspection_Vehicle_Defect(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;

除了我只想要 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,我想要那些记录。

2 个答案:

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