我的查询遇到此问题:当子表的所有值都不存在或为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,但是我不确定它能否解决我的问题(或者,也许我误解了它们在这种情况下的用处)。
在此问题上的任何帮助将不胜感激。谢谢!
答案 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)