2016-07-29 41 views
3

這可能是真的,但基本我卡!右加入表本身SQL

我有兩個表,一個顯示了班級的學生都在和另一這表明各年級學生已經收到了什麼。我想找出哪些學生,從一個特定的班級,沒有成績。

我寫了這個代碼爲起點,其發現在一類是有成績的學生名單:

SELECT mem.student_id, mem.class_id 
FROM class_memberships as mem 
inner join grades as gr 
on mem.student_id = gr.student_id 
where mem.class_id = 12 and gr.grade_type = 18 

一個可行的治療,但我真正需要的是在學生他們沒有成績,而不是那些成績。我以爲我可以右連接對成員表如下,但它沒有工作:

SELECT mem.student_id, mem.class_id 
FROM class_memberships as mem 
inner join grades as gr 
on mem.student_id = gr.student_id 
right join class_memberships as mem2 
on mem.student_id = mem2.student_id 
where mem.class_id = 12 and gr.grade_type = 18 
and mem.student_id is null 

以上不返回任何行,我知道有一個學生沒有一個檔次。我跟着google上的SQL右鍵連接的例子來到上面。我想這是不工作的,因爲'mem.student_id是空'子句,但谷歌上的所有作弊表示我需要它。

請幫忙!我是SQL的新手(一般編碼),所以這可能是非常基本的,但我無法在任何地方找到答案。謝謝:)

+4

如果這是sql server,Google'SQL Server NOT EXISTS'。還要標記這個問題適用於哪個RDBMS。 – dfundako

+0

僅供參考,沒有人使用'RIGHT JOIN'。 'LEFT JOIN',是...但通常如果我們傾向於使用'RIGHT JOIN'我們重寫所以,這是一個'LEFT JOIN'。從最小的桌子開始,找到你需要的東西。 – SQLMason

回答

1

你也許並不需要一個3路連接都:

SELECT student_id 
FROM class_membership 
LEFT JOIN grades ON (class_membership.student_id = grades.student_id 
    AND class_membership.class_id = grades.class_id) 
WHERE grades.student_id IS NULL 

class_membership已經擁有所有的學生列出來的,所以你只需要找出哪些不具備成績,這意味着他們的「成績」條目將爲空。

+0

謝謝,我不理解我正在嘗試遵循的指南,所以我沒有意識到我需要查找無效的成績。感謝您的解釋! – grumpasaurus

1

其實,你真的只是需要做一個LEFT JOINgradesLEFT JOIN旨意顯示所有的class_memberships記錄無論是否有相應的grades記錄。然後你就可以過濾掉那些沒有成績

SELECT mem.student_id, mem.class_id 
FROM class_memberships as mem 
LEFT JOIN grades as gr ON mem.student_id = gr.student_id 
WHERE mem.class_id = 12 
AND gr.id IS NULL --I'm not sure what your pk field is for your grades table 
+0

太棒了,我不知道我可以做gr.id爲null!謝謝 – grumpasaurus

0
記錄
SELECT mem.student_id, mem.class_id 
FROM class_memberships as mem 
inner join grades as gr 
on mem.student_id = gr.student_id 
where mem.class_id = 12 
and gr.student_id NOT EXISTS (select student_id from class_memberships where class_membership is null) 
0

你所尋找的是NOT EXISTS

SELECT m.student_id, m.class_id 
FROM class_memberships m 
WHERE m.class_id = 12 AND 
     NOT EXISTS (SELECT 1 
        FROM grades g 
        WHERE g.student_id = m.student_id AND gr.grade_type = 18 
       ); 

不過,我對你的數據結構非常可疑。我希望grades不得不類的鏈接,以及學生:

SELECT m.student_id, m.class_id 
FROM class_memberships m 
WHERE m.class_id = 12 AND 
     NOT EXISTS (SELECT 1 
        FROM grades g 
        WHERE g.student_id = m.student_id AND g.class_id = m.class_id 
       ); 

不過,我可能會被誤解的數據結構。

0

這打破它

其中mem.class_id = 12,gr.grade_type = 18

爲什麼加入到同一個表兩次?

SELECT mem.student_id, mem.class_id 
FROM class_memberships as mem 
left join grades as gr 
     on mem.student_id = gr.student_id 
     and gr.grade_type = 18 
where gr.student_id is null 
    and mem.class_id = 12