[英]Selecting exact value in SQL
我坚持查询并决定在这里寻求帮助。 我有2个表学生和价值观 。 在学生中我有名字和价值观我有成绩。
假设我们有3 名学生 。
**X** 7,8,10
**Y** 6,9,7
**Z** 7
如何选择等级为“7”的学生? 我试过了:
SELECT WHERE grade = 7但考虑到有“7”的学生,也考虑其他成绩。
我认为这个问题很棘手,有人可以提一下吗?
一种方法是使用无条件和有条件计数之间的比较:
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
;
一种简单的方法是查看这样的任务:找到没有七年级以上成绩的学生。
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
);
我认为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;
怎么用count和sum? 那会有用吗?
select s.student, Count(v.grade), sum(v.grade)
From student as s
join values as v on v.student = s.student
group by student
having sum(v.grade) = 7 and count(v.grade) = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.