如何检索所有匹配的记录

时间:2014-07-22 18:51:51

标签: sql

我有3个表,StudentSubjectEnrollment。所有3个表中的样本数据如下

ID Name
1 John
2 Matt
3 Smith

ID Name
1 Maths
2 English
3 Science

StId SubId
1     1
1     2
1     3
2     1
2     2
3     3

从上表中可以清楚地看出John被映射到所有3个科目,Matt被映射到2个科目而Smith被映射到只有1个科目。现在,我应该如何编写通用查询来获取映射到所有主题的学生的详细信息?请记住,未来学生和学科人数可能会增加。

1 个答案:

答案 0 :(得分:3)

诀窍是建立一个相关的子查询,在那里你得到一个有问题的学生没有参加的科目列表

DECLARE @N TABLE(NID INT, NName varchar(10))
DECLARE @C TABLE(CID INT, CName varchar(10))
DECLARE @E TABLE(NID INT, CID INT)
INSERT INTO @N VALUES(1,'John'),(2 ,'Matt'),(3,'Smith')
INSERT INTO @C VALUES(1,'Math'),(2 ,'English'),(3,'Science')
INSERT INTO @E VALUES(1,1),(1,2),(1,3),(2,1),(2,2),(3,3)

SELECT * 
FROM @N as N 
WHERE NOT EXISTS (SELECT * 
                  FROM @C as C 
                  WHERE NOT EXISTS (SELECT * 
                                    FROM @E as E 
                                    WHERE E.NID = N.NID 
                                        and E.CID = C.CID ))

编辑:顺便说一句,如果你允许NULL,这就会崩溃。

此外,如果从内到外看,这是最容易理解的。在最深的嵌套中,您将获得给定课程的给定名称的“注册”列表。一层,你正在寻找没有这种注册的课程。从那里开始,你正在寻找一个没有这样一门课程的学生。因此,您的查询将变为“查找所有没有课程但学生没有学习的学生的详细信息”

感谢Bluefeet,格式确实看起来更好: - )