我有3个表,Student
,Subject
和Enrollment
。所有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个科目。现在,我应该如何编写通用查询来获取映射到所有主题的学生的详细信息?请记住,未来学生和学科人数可能会增加。
答案 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,格式确实看起来更好: - )