2014-09-01 93 views
0
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. 記錄(學生)指數(PR鍵),姓名,...,id_studie(1)(關鍵)
  2. EXAMS [指數(學生)(PK),id_course(PK),...,得分(2),application_status]
  3. 課程[id_course(PK),...,分]
  4. REQUIRED_COURSES [id_studie(FK), id_course(fk),...]

(1)我不知道更好的窩rd英文。當某些教員有信息學,數學,物理等課程時。信息學是一個研究。 (2)得分從5到10. 10是最好的。傳球至少需要6次。

查詢: - 查找所有通過所有必修考試的學生,通過studie thay studie。打印索引和點數。

我的問題:同一個人可以解釋這是如何工作在簡單的話?

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

對不起,我的英語不好。

+0

我認爲這篇文章由喬Celko可能會幫助你:[分開我們的立場:關係部門的SQL](https://www.simple-talk.com/sql/t-sql-programming/divided-we- stand-the-sql-of-relational-division /) – jpw 2014-09-01 14:51:45

+1

這是**真正的**幫助。非常感謝你。 我不知道這叫做師。 – Nemanja 2014-09-01 15:39:52

回答

2

總是從內向外分析查詢。

最內層查詢: 選擇與得分考試高於5

中東之一:

選擇沒有與得分高於5

外一個考試的必修課程:

選擇沒有必要的課程,沒有分數高於5的考試的學生

+0

我不能給你+1,因爲我沒有足夠的聲望,但這是我所要求的 - 簡單的解釋。 我不確定我是否知道如何編寫它,但至少我現在明白了。 – Nemanja 2014-09-01 15:55:38

1

該示例是一個雙嵌套NOT EXISTS查詢。

如果一個子查詢返回任何行可言,EXISTS子查詢TRUENOT EXISTS子查詢FALSE

也就是說,它在NOT EXISTS子句中有NOT EXISTS子句。

這是比較容易說,嵌套NOT EXISTS回答這個問題:「爲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,並獲取所有的必修課程,其中學生還沒有散盡的考試(如學生沒有一個得分超過5)。你應該有,他們都沒有成功的所有學生的課程名稱

3部分:加入第2個部分結果與指數RECORDS表,也COURSES表上的課程ID來獲取點的指數總和。你可以看到這部分分成兩部分。首先是正常的JOIN和兩個表格,然後是NOT EXISTS和第二部分。當您在第二部分上應用NOT EXISTS時,您將獲得所有成功的學生ID,這些ID將通過在末尾添加另一個SCORE > 5條件爲您提供成功條目。