Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL在多对多关系中查找不属于特定集合的所有元素_Sql_Many To Many - Fatal编程技术网

SQL在多对多关系中查找不属于特定集合的所有元素

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

我对此任务有问题:

这就是关系

学生: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 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讲座的学生-无论发生什么-您被允许参与此查询。但是谢谢你的努力;谢谢,这正是我想要的;