选择...不存在不存在查询

时间:2014-09-01 14:48:24

标签: sql tsql exists

select r.index, sum(c.points)
from records r join exams e2 on r.index = e2.index
    join courses c on c.id_course = e2.id_course
where not exists ( select *
                    from required_courses rs
                    where rs.id_studie = r.id_studie
                        and not exists (select *
                                        from exams e
                                        where e.id_course = rs.id_course
                                            and r.index = e.index
                                            and score>5))
    and score>5
group by index;

我有那个查询。我知道它的作用,但不知道如何。

我有16个表格相对较大的数据库,但在此查询中只使用4个。

使用过的表格是:

  1. RECORDS(学生)[索引(公钥),姓名,姓名,...,id_studie(1)(for。键)]
  2. EXAMS [索引(学生)(p.k。),id_course(p.k。),...,score(2),application_status]
  3. COURSES [id_course(p.k。),...,points]
  4. REQUIRED_COURSES [id_studie(f.k。),id_course(f.k),...]
  5. (1)我不太懂英文。在某些教师身上有信息学,数学,物理等课程。信息学是一个研究。 (2)分数从5到10分.10是最好的。通过时至少需要6个。

    查询: - 找到所有通过studie thay studie所有必修考试的学生。打印索引和点数。

    我的问题:同一个人可以用简单的词语解释这是如何工作的?

    我不明白不存在&不存在的部分。

    抱歉我的英语不好。

2 个答案:

答案 0 :(得分:2)

始终从内到外分析查询。

最内层查询: 选择分数高于5的考试

中间一个:

选择没有得分高于5的考试所需的课程

外面的一个:

选择没有必修课程且未获得分数高于5的考试的学生

答案 1 :(得分:1)

该示例是双嵌套NOT EXISTS查询。

如果子查询返回任何行,EXISTS子查询为TRUENOT EXISTS子查询为FALSE

也就是说,它在NOT EXISTS子句中有一个NOT EXISTS子句。

更容易说嵌套NOT EXISTS回答问题“对于所有y来说,x是否为真?”

--Part 3
SELECT r.index, 
       SUM(c.points) 
FROM   records r 
       join exams e2 
         ON r.index = e2.index 
       join courses c 
         ON c.id_course = e2.id_course 
WHERE  NOT EXISTS (
--Part 2 starts
                   SELECT * 
                   FROM   required_courses rs 
                   WHERE  rs.id_studie = r.id_studie 
                          AND NOT EXISTS (
--Part 1 starts                                         
                                          SELECT * 
                                          FROM   exams e 
                                          WHERE  e.id_course = rs.id_course 
                                                 AND r.index = e.index 
                                                 AND score > 5
--Part 1 ends
                                                              )
--Part 2 ends                                         
                                                               )
       AND score > 5 
GROUP  BY index; 
--Part 3 ends                                         

第1部分:从EXAMS表中获取得分超过5分的学生的所有记录。您应该获得所有课程的所有通过考试的学生

第2部分:在学生ID上以REQUIRED_COURSES加入Part1结果,并获取学生尚未通过考试的所有必修课程(学生的分数不超过5分) )。你应该把所有学生的课程名称都用在不成功的地方

第3部分:使用索引上的RECORDS表以及课程ID上的COURSES表来加入第2部分结果,以获取索引和点总和。你可以把这部分分成两部分。首先是包含两个表的普通JOIN,然后是包含第2部分的NOT EXISTS。当您在第2部分上应用NOT EXISTS时,您将获得所有成功的学生ID通过在结尾添加另一个SCORE > 5条件来获得成功的条目。