根据两个联接表的结果从查询中排除记录

时间:2019-09-17 20:10:27

标签: mysql sql

我有一个用于检查大学宿舍的应用程序。员工经过房间并根据检查项目清单进行检查,并将条件标记为合格或不合格。每次检查都有25条明细行,可以标上通过或不通过

表1是检查表insp_no,描述,insp_type,room_no,status_code,edit_clerk

表2是检查行明细表insp_no,line_no,描述,结果

表1是检查信息,表2具有检查的详细信息和结果。表在insp_no上联接。

我能做的最好的事情就是将行隔离开来。

SELECT  DISTINCT t1.insp_no, t1.description, t1.status_code, t1.room_no, t1.edit_clerk, 
t1.edit_date, t2.line_no, t2.description, t2.result
FROM t1
LEFT JOIN t2 on t2.insp_no = t1.insp_no
where t1.INSP_TYPE = 'room_CHECKLIST'
AND not(t2.result <>'fail');

但是我想做相反的事情,只返回表1中没有表2中失败细节的检查,并从表1中排除任何t2细节行处于失败状态的检查#。

我得到1076个结果,这些结果是每次检查,因为每个检查都有通过的明细行,或者我得到309个结果,这些结果是失败的各个明细行的数量。

我希望得到不带故障线的765次检查结果。请帮助:)

1 个答案:

答案 0 :(得分:2)

您可以使用带有关联子查询的NOT EXISTS条件来代替联接。

SELECT  t1.* 
FROM t1
WHERE 
    t1.INSP_TYPE = 'room_CHECKLIST'
    AND NOT EXISTS (
        SELECT 1 
        FROM t2 
        WHERE t2.insp_no = t1.insp_no
        AND t2.result ='fail'
    )

NOT EXIST条件确保对于当前t1记录,表t2中没有失败状态的记录。