首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SQL中选择确切的值

在SQL中选择确切的值
EN

Stack Overflow用户
提问于 2016-11-14 19:43:41
回答 4查看 555关注 0票数 1

我被一个问题困住了,决定在这里寻求帮助。我有两个表,、学生、。在学生中,我有名,,在值中,有分数。

假设我们有3个学生,

代码语言:javascript
复制
**X** 7,8,10
**Y** 6,9,7
**Z** 7 

我如何选择分数正好是"7“的学生?我试过:

选择WHERE年级= 7,但它考虑到了有"7“级的学生,也考虑了其他年级的学生。

我认为这个问题很棘手,有人能给点提示吗?

EN

回答 4

Stack Overflow用户

发布于 2016-11-14 19:49:45

一种方法是对无条件计数和条件计数进行比较:

代码语言:javascript
复制
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)。

另一种解决办法(效率较低):

代码语言:javascript
复制
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
;
票数 2
EN

Stack Overflow用户

发布于 2016-11-14 20:06:08

一个简单的方法是这样看待任务:找到除了七年级以外没有其他成绩的学生。

代码语言:javascript
复制
select *
from students
where not exist
(
  select *
  from grades
  where grades.student_id = students.student_id
  and grades.grade <> 7
);

代码语言:javascript
复制
select *
from students
where student_id not in
(
  select student_id
  from grades
  where grade <> 7
);
票数 0
EN

Stack Overflow用户

发布于 2016-11-14 20:08:54

我认为,在INNER JOIN之后再加上一个专用的LEFT JOIN就可以做到这一点。就像这样:

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40596623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档