SQL,根据第三个表从两个表中选择,它引用它们

Posted

技术标签:

【中文标题】SQL,根据第三个表从两个表中选择,它引用它们【英文标题】:SQL, select from two tables based on a third, which references them 【发布时间】:2018-05-02 09:36:24 【问题描述】:

刚从 SQL 开始,第一个通宵工作已经到来。

我有三张桌子:

student (student_id, first_name, last_name)
course (course_id, name)
exam (ref_to_student_id, ref_to_course_id, score)

对于所有考试成绩 > X 的情况,我如何做出选择声明并列出学生姓名、姓氏和课程名称?

这是我最好的镜头:

SELECT last_name FROM student WHERE student_id IN 
 (SELECT ref_to_student_id FROM exam WHERE score > 50)
UNION ALL
SELECT name FROM course WHERE course_id IN
 (SELECT ref_to_course_id FROM exam WHERE score > 50)

这是错误的,因为我得到:

last_name
last_name
name
name
name

并且无法准确判断哪个学生在哪个考试/课程中得分高于 X。

在我看来,是这样的:

SELECT first_name, last_name, name
FROM student, course
WHERE student_id, course_id
IN (SELECT ref_to_student_id, ref_to_course_id FROM exam WHERE score > 50) 

会产生这样的结果:

John Doe Chemistry
Jane Dove English
...

但是,它只会生成有关语法错误的通知。

【问题讨论】:

【参考方案1】:

您可以像这样在表之间使用内连接:

SELECT s.first_name AS first_name, s.last_name AS last_name, c.name AS course_name
FROM student s
INNER JOIN exam e ON e.ref_to_student_id = s.student_id
INNER JOIN course ON c.course_id = e.ref_to_course_id
WHERE e.score > 50;

【讨论】:

【参考方案2】:

你需要加入这些表,而不是union它们:

SELECT last_name, first_name, name, score
FROM   student s
JOIN   exam e ON s.student_id = e.ref_to_student_id
JOIN   course c ON e.red_to_course_id = c.course_id
WHERE  score > 50

【讨论】:

【参考方案3】:

朋友,试试这个:

SELECT s.first_name, s.last_name, c.name
FROM exam e
JOIN student s ON s.student_id = e.ref_to_student_id
JOIN course c ON c.course_id = e.ref_to_course_id
WHERE e.score > 50

希望能帮到你!

【讨论】:

以上是关于SQL,根据第三个表从两个表中选择,它引用它们的主要内容,如果未能解决你的问题,请参考以下文章

mysql 根据数据所在的表从表中选择

Laravel Raw 语句我可以根据列数据是不是等于另一个表从不同的表中进行选择

汇总SQL中2个不同表中的3列

我想从两个表中选择某些列,并创建一个连接到第三个表

选择Statement以根据在Textbox中输入的ID从两个表中选择记录

SQL INNER JOIN - 根据另一行的值从另一个表中选择数据