我很犹豫,我没有得到解决方案,所以我转过来。 快速解释一下,假设我想按如下方式过滤查询:
SELECT name FROM students WHERE courseCode IN (17, 18, 19);
在这里,我将了解注册17 或 18 或 19的课程的学生。
现在,您如何获得参加这3门课程的学生?也就是说,在17 和 18 和 19?
当你知道“courseCode”值是什么时,它可能很简单,但是当你用子查询得到这些值时你会怎么做呢?
这样的事情:
SELECT name FROM students WHERE courseCode = 17 and courseCode = 18 and courseCode = 19;
当我知道值(这不正确)时
但是当我不知道它们是什么价值时我该怎么办?像这样:
SELECT name FROM students WHERE courseCode IN (SELECT courseCode FROM course WHERE ...);
我希望你能很好地解释我,谢谢你的帮助
答案 0 :(得分:2)
这是一种可行的方法,使用GROUP BY进行折叠并获取不同的课程代码,并将其与文字进行比较:
SELECT s.name
FROM students s
WHERE s.courseCode IN (17,18,19)
GROUP BY s.name
HAVING COUNT(DISTINCT s.courseCode) = 3
(17,18,19)
可以用子查询替换。但我倾向于使用内联视图和连接操作。
SELECT s.name
FROM students s
JOIN ( SELECT 17 AS courseCode
UNION ALL SELECT 18
UNION ALL SELECT 19
) c
ON c.courseCode = s.courseCode
GROUP BY s.name
HAVING COUNT(DISTINCT s.courseCode) = 3
内联视图c
的查询只需返回具有适当数据类型的名为courseCode
的列的不同值...很多可能的查询都可以...
JOIN ( SELECT foo AS courseCode
FROM bar
WHERE ...
GROUP BY foo
) c
这是一种方法的例子,还有其他方法......