SQL在多对多关系中查找不属于特定集合的所有元素
我对此任务有问题: 这就是关系 学生:ST S,SNAME 讲座:L,L名,ECTS 谁参加什么:L,S 发现没有参加任何讲座的学生有更多 大于4 ECTS 我知道我可以通过检查给定学生的ECTS的最大值是否大于4来实现,但作为学习的一部分,我希望以不同的方式实现。也就是说,我想使用子查询来实现:SQL在多对多关系中查找不属于特定集合的所有元素,sql,many-to-many,Sql,Many To Many,我对此任务有问题: 这就是关系 学生:ST S,SNAME 讲座:L,L名,ECTS 谁参加什么:L,S 发现没有参加任何讲座的学生有更多 大于4 ECTS 我知道我可以通过检查给定学生的ECTS的最大值是否大于4来实现,但作为学习的一部分,我希望以不同的方式实现。也就是说,我想使用子查询来实现: SELECT S.[S#], SNAME FROM ST INNER JOIN LS ON LS.[S#] = S.[S#] WHERE LS.[L#] /* and here is a proble
SELECT S.[S#], SNAME
FROM ST
INNER JOIN LS ON LS.[S#] = S.[S#]
WHERE LS.[L#] /* and here is a problem, I want a statement like "none of LS.[L#] exists in" */ (SELECT [L#] FROM L WHERE ECTS > 4)
我的想法是,从L中选择[L],其中ECTS>4将返回所有ECTS大于4的讲座,然后我只需要检查该集中是否存在通过LS表分配给学生的讲座,然后跳过它
我知道存在像所有和任何操作符一样的操作符,但它似乎在任何配置中都不起作用
例如,我尝试了其中NOT LS。[L]=从L中选择[L],其中ECTS>4,但由于它是根据LS。[L]单独操作的,它只是返回给我学生,他们至少有一节关于ECTS 4的课,给了我一个完全否定的集合,我想这不会颠倒这个集合,但很可能不会,我想要的是所有的学生,其中LS。[L]=从L中选择[L],其中ECTS>4
以这种方式,这个问题有没有一个简洁的解决方案?您可以使用notexists,如下所示:
SELECT S.[S#], SNAME
FROM ST
INNER JOIN LS ON LS.[S#] = S.[S#]
WHERE not exists
(select 1 from L
Where L.[L#] = LS.[L#]
AND L.ECTS > 4)
使用一个子查询,我们将命名为Temp,该子查询包含参加超过4个ECT的讲座的学生列表,我们可以从该列表中不包含左联接的学生中进行选择:
SELECT
ST.[S#],
ST.SNAME
FROM ST
LEFT JOIN
(SELECT LS.[S#]
FROM SL
JOIN L
ON SL.[L#] = L.[L#]
WHERE L.ECTS > 4
) AS Temp
ON ST.[S#] = Temp.[S#]
WHERE Temp.[S#] IS NULL
您可以使用“不存在”,但正确的逻辑是:
SELECT S.[S#], s.SNAME
FROM S
WHERE NOT EXISTS (SELECT 1
FROM LS JOIN
L
ON L.[L#] = LS.[L#]
WHERE LS.[S#] = S.[S#] AND L.ECTS > 4
) ;
也就是说,您希望加入子查询。作为一项规则,请避免使用ANY/ALL=,因为这确实令人困惑。在不存在的地方写入通常更清晰,从L中选择[L],其中ECTS>4和LS。=[L]左连接/为空通常比不存在更糟糕。这是不正确的。这将返回参加任何不超过4 ECT的讲座的学生。@GordonLinoff:这就是问题中所写的查找不参加任何不超过4 ECT的讲座的学生和SNAME。这个问题意味着任何讲座都不会超过4个ECT。如果英语不是你的第一语言,我能理解你的困惑。但我仍然感到困惑。我知道你们比我高,但我仍然能够把问题和答案一一对应起来。不存在超过4 ECT的讲座。这就是我的查询所做的。如果我错了,请原谅@GordonLinoff@Popeye是的,我试过了-它返回至少参加过一次ECTS 4讲座的学生-无论发生什么-您被允许参与此查询。但是谢谢你的努力;谢谢,这正是我想要的;