我被一个问题困住了,决定在这里寻求帮助。我有两个表,、学生、和值。在学生中,我有名,,在值中,有分数。
假设我们有3个学生,。
**X** 7,8,10
**Y** 6,9,7
**Z** 7 我如何选择分数正好是"7“的学生?我试过:
选择WHERE年级= 7,但它考虑到了有"7“级的学生,也考虑了其他年级的学生。
我认为这个问题很棘手,有人能给点提示吗?
发布于 2016-11-14 19:49:45
一种方法是对无条件计数和条件计数进行比较:
select s.student_name
from students s join grades g on s.student_id = g.student_id
group by student_id
having count(*) = count(case when g.value = 7 then 1 end)
;(沿途猜测一些列名)
它的工作原理:加入两个表后,行按student_id分组。然后COUNT(*)计数所有年级,条件计数计数等于7的分数。查询返回两个分数相等时的学生姓名(意味着所有年级都是7)。
另一种解决办法(效率较低):
select s.student_name
from students s inner join grades g on s.student_id = g.student_id
where g.grade = 7
minus
select s.student_name
from students s inner join grades g on s.student_id = g.student_id
where g.grade != 7 or g.grade is null
;发布于 2016-11-14 20:06:08
一个简单的方法是这样看待任务:找到除了七年级以外没有其他成绩的学生。
select *
from students
where not exist
(
select *
from grades
where grades.student_id = students.student_id
and grades.grade <> 7
);或
select *
from students
where student_id not in
(
select student_id
from grades
where grade <> 7
);发布于 2016-11-14 20:08:54
我认为,在INNER JOIN之后再加上一个专用的LEFT JOIN就可以做到这一点。就像这样:
WITH
seven AS (
SELECT a.id, a.name, b.grade
FROM student_name a
INNER JOIN student_grade b
ON a.id = b.id
WHERE b.grade = '7'
)
, not_seven AS (
SELECT a.id, a.name, a.grade
FROM seven a
LEFT JOIN student_grade
ON a.id = b.id
WHERE b.id IS NULL
AND b.grade <> '7'
)
SELECT * FROM not_seven;https://stackoverflow.com/questions/40596623
复制相似问题