SQL:如果子表中的所有值均为FALSE,则选择父记录

时间:2018-11-06 19:21:50

标签: sql reporting-services

我的查询遇到此问题:当子表的所有值都不存在或为FALSE时,我试图从父表中获取所有记录。

表格如下:

Admission (parent table)            Courses (child table)
------------------------            ---------------------
IDAdmission                         IDCourse
[Other data]                        IDAdmission 
                                    CourseCompleted
                                    [Other data]

一次录取可以拥有多个(或没有)课程的地方。

例如,如果我的查询是

SELECT Admission.IDAdmission, Courses.IDCourse, Courses.IDAdmission,
Courses.CourseCompleted FROM Admission LEFT OUTER JOIN Courses ON 
Admission.IDAdmission = Courses.IDAdmission

我将获得以下记录:

Admission           Courses
IDAdmission         IDCourse    IDAdmission    CourseCompleted
--------------------------------------------------------------
123                 001         123            false
123                 002         123            true
456                 001         456            false
456                 004         456            false
456                 006         456            false
789                 002         789            true
789                 006         789            false
345                 NULL        NULL           NULL

现在,我要寻找的是仅在所有Admission条件为假的情况下从父表CourseCompleted获取记录。如果条件为NULL,则也应选择该条件。

因此,从上述数据中,我想从父表Admission中选择以下内容:

IDAdmission
-----------
456
345

我正在尝试在报告中获取此信息,因此无法使用临时表。我已经研究过Anti-Join,但是我不确定它能否解决我的问题(或者,也许我误解了它们在这种情况下的用处)。

在此问题上的任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以在EXISTS中使用子查询来排除所有至少完成1门课程的录取记录。

SELECT
    Admission.IDAdmission
FROM Admission
WHERE NOT EXISTS (
    SELECT * FROM Courses C2
    WHERE C2.IDAdmission = Admission.IDAdmission
        AND C2.CourseCompleted = 'true'
)

答案 1 :(得分:1)

这应该有效:

select a.IDAdmission 
from Admission a 
where not exists (select 1 from Courses c 
                  where c.IDAdmission =  a.IDAdmission 
                  and c.CourseCompleted = true)