说我有两张表中的这些数据:
学生表列:
id | name
课程表列:
id | code | name
我想使用Student.id AS Student和Course.id AS课程 得到以下内容:
Student | Course
-----------------
1 | C
1 | B
1 | A
2 | F
2 | B
2 | A
3 | C
3 | B
3 | F
我如何查询它以便它只返回带有课程C的学生和他们的其他课程,如下所示:
Student | Course
-----------------
1 | C
1 | B
1 | A
3 | C
3 | B
3 | F
? 我试过了:
SELECT Student.id, Course.code FROM Course
INNER JOIN Student ON Course.student = Student.id
WHERE Course.code = 'C'
但我只有
Student | Course
-----------------
1 | C
3 | C
答案 0 :(得分:2)
SELECT s.id, c.code
FROM Course c
INNER JOIN Student s
ON c.student = s.id
WHERE EXISTS
(
SELECT 1
FROM Course c1
WHERE c.student = c1.student
AND c1.Course = 'C'
)
答案 1 :(得分:1)
解决此问题的最有效方法通常是内联视图和JOIN操作,但有几种方法可以获得相同的结果。
SELECT Student.id
, Course.code
FROM ( SELECT c.Student
FROM Course c
WHERE c.code = 'C'
GROUP BY c.Student
) o
JOIN Course
ON Course.Student = o.Student
JOIN Student
ON Student.id = Course.Student
在这里,我们使用内嵌视图(别名为o)来获取学生参加课程代码的列表=' C'。
(注意:我的答案中的查询是基于您的原始查询。如果在课程和学生之间有外键定义,我们只需要返回Student.id,我们可以通过省略加入学生,并在SELECT列表中返回Course.Student AS id
代替Student.id
。)
答案 2 :(得分:0)
这里第一个JOIN只选择那些有C课程的学生,第二个JOIN为你提供每个学生的所有课程。
SELECT st.id, c2.code FROM
Student st
JOIN Course c ON c.student = st.id AND c.code = "C"
JOIN Course c2 ON c2.student = st.id
你实际上在这里甚至不需要两张桌子,因为学生和课程都可以在课程表中找到,只需加入它自己:
SELECT c2.student, c2.code FROM
Course c JOIN Course c2 ON c.student = c2.student
WHERE c.course = "C"
这里的WHERE子句会留下具有课程C的学生ID,然后你加入那些以查找所有课程。