SQL:如何在连接操作中过滤集合?



我有3张桌子。

CREATE TABLE students (
student_id   INT         NOT NULL,
student_name VARCHAR(10) NOT NULL,
PRIMARY KEY (student_id)
);
CREATE TABLE courses (
course_id   INT         NOT NULL,
course_name VARCHAR(10) NOT NULL,
PRIMARY KEY (course_id)
);
CREATE TABLE student_courses (
student_id INT NOT NULL,
course_id  INT
);

我想让所有分配到 2 门以上课程的学生。这是我的尝试:

SELECT
s.student_name,
c.course_name
FROM students s
JOIN student_courses sc
ON s.student_id = sc.student_id
JOIN courses c
ON c.course_id = sc.course_id
WHERE s.student_id
IN (SELECT s.student_id
FROM students s
JOIN student_courses sci
ON s.student_id = sci.student_id
JOIN courses ci
ON ci.course_id = sci.course_id
GROUP BY s.student_id
HAVING COUNT(s.student_id) > 2);

它有效。但我认为这应该是一种更简单的方法。

从技术上讲,这就足够了:

SELECT student_id FROM student_courses GROUP BY student_id HAVING count(*) > 2

它返回分配到 2 门以上课程的任何学生的学生 ID

如果需要有关学生的详细信息,可以为此查询添加别名,并将其他表联接到该查询

SELECT ... FROM students s INNER JOIN
(SELECT student_id FROM student_courses GROUP BY student_id HAVING count(*) > 2) a ON a.student_id = s.id

请注意,您的规范与您的"它有效"代码不一致,因为该代码说HAVING count(*) > 1

"尽量避免在列表中使用IN的时间超过你愿意手写的时间"是我一直试图实现的经验法则

最新更新