我有一个用于检查大学宿舍的应用程序。员工经过房间并根据检查项目清单进行检查,并将条件标记为合格或不合格。每次检查都有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次检查结果。请帮助:)
答案 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
中没有失败状态的记录。