2014-10-12 124 views
0

我有一個課本問題;列出每個班級的A級和A級人員的ID和姓名;POSTGRESQL:如何篩選以產生查詢?

學生{studentID,名} 級{studentID,courseName,等級}

,我不知道如何過濾掉檔次,這樣我只顯示一個學生。 到目前爲止,我已經解決

SELECT Student.studentID, Student.name 
FROM Student, Grade 
WHERE Student.studentID = Grade.StudentID AND 
Grade.grade = 'A' AND 
Grade.grade != 'B' AND 
Grade.grade != 'C' AND 
Grade.grade != 'D' AND 
Grade.grade != 'F'; 

有一個更清潔的方式,我可以篩選此。看起來有點乏味,我寫了不平等4次。

+0

你的意思是在所有科目學生A級,也課程表中沒有使用FROM – radar 2014-10-12 12:49:53

+0

類對不起這是一個錯誤,我不知道爲什麼我寫的課程,而不是 – seriallchiller 2014-10-12 12:53:23

+0

級如果'等級'等於'A',它必須與其他任何東西不同。你不需要'!='條件 – 2014-10-12 12:54:53

回答

1

您可以使用NOT EXISTS類。我們讓所有沒有拿到A的學生過濾出來。

SELECT DISTINCT Student.studentID, Student.name 
FROM Student 
JOIN Grade 
ON Student.studentId = Grade.studentId 
WHERE NOT EXISTS (SELECT 1 FROM Grade G 
        WHERE G.grade !='A' 
        and G.studentID = Student.studentID 
       ) 
+0

此查詢將爲您提供所有沒有成績的學生。 – 2014-10-12 13:21:09

+0

@IgorRomanchenko,好點,我加入了主要的選擇來處理。 – radar 2014-10-12 13:45:35

2
select studentid, s.name 
from 
    student s 
    inner join 
    grade g using (studentid) 
group by studentid, s.name 
having bool_and(g.grade = 'A')