我在select查询中遇到问题,无法确定如何修复。我有两张table:
TABLE_students
|--------|------------|--------|
| STU_ID | EMAIL | NAME |
|--------|------------|--------|
| 1 | a@e.com | Bob |
| 2 | b@e.com | Joe |
| 3 | c@e.com | Tim |
--------------------------------
TABLE_scores
|--------|------------|-------------|--------|
| SRE_ID | STU_ID | DATE | SCORE |
|--------|------------|-------------|--------|
| 91 | 2 | 2018-04-03 | 78 |
| 92 | 2 | 2018-04-06 | 89 |
| 93 | 3 | 2018-04-03 | 67 |
| 94 | 3 | 2018-04-06 | 72 |
| 95 | 3 | 2018-04-07 | 81 |
----------------------------------------------
我试图从两个表中选择数据,但有一些要求。我需要选择学生,即使他们在分数表中没有分数。我也只想要最新的分数记录。
下面的查询只返回那些有分数的学生,它还重复返回总共5行(因为有5个分数)。我希望查询返回三行(每个学生一行)及其最新分数值(如果没有分数,则返回null):
SELECT students.NAME, scores.SCORE FROM TABLE_students as students, TABLE_scores AS scores WHERE students.STU_ID = scores.STU_ID;
我很难弄清楚如何拉所有的学生,不管他们是否有一个分数,以及如何拉只有最新的分数,如果他们有一个。
谢谢您!
2条答案
按热度按时间ejk8hzay1#
这是组最大n个问题的一个变体,这在堆栈溢出中很常见。
我会通过几个连接来实现这一点:
如果c2.stu\u id为空,则表示左连接匹配的行中没有比c1中的行具有更大日期的行(或者在并列的情况下具有更大sre\u id)。这意味着c1中的行必须是最近的,因为没有其他行是最近的。
p、 学生:请学习英语
JOIN
语法,并避免“逗号式”联接。JOIN
自1992年以来一直是标准的。p、 注意:我从你的表名中去掉了多余的“table\”前缀。您不需要使用表名来提醒自己它是一个表!:-)
e5nqia272#
可以使用相关子查询: