2013-02-03 109 views
1

我試圖解決一個看似簡單的問題,但我想我正在跳過了解EXISTS關鍵字的工作原理。問題很簡單(這是實際問題的簡單版本) - 我有一張學生表和一張愛好表。學生表中有他們的學生ID和姓名。僅返回具有相同業餘愛好數的學生(即不會顯示具有獨特業餘愛好的學生)SQL比較同一表中的COUNT值

因此,我遇到的困難是如何比較業餘愛好的數量。我試過的是這個。

SELECT sa.studentnum, COUNT(ha.hobbynum) 
FROM student sa, hobby ha 
WHERE sa.studentnum = ha.studentnum 
AND EXISTS (SELECT * 
      FROM student sb, hobby hb 
      WHERE sb.studentnum = hb.studentnum 
      AND sa.studentnum != sb.studentnum 
      HAVING COUNT(ha.hobbynum) = COUNT(hb.hobbynum) 
      ) 
GROUP BY sa.studentnum 
ORDER BY sa.studentnum; 

那麼,什麼似乎發生的是,hobbynums的數量是相同的每個測試,結果全部被返回的原始表,而不是隻爲匹配了相同數量的愛好是。

+0

你只是比較兩個學生的興趣愛好,這足夠了嗎?我的意思是說那種愛好怎麼樣?我喜歡學習和其他人喜歡游泳,我們兩個人的觀點是否一致?! – Rikki

+0

是的 - 只是在這種情況下的計數,實​​際的愛好並不重要,這是實際問題的簡化版本 –

+0

簡化版本的問題更令人困惑,我建議您與真實情況一起,我們可以在那裏談論你需要改變的地方 – Rikki

回答

2

沒有測試,但也許這樣的事情(如果我理解正確的問題):

WITH h AS (
    SELECT studentnum, COUNT(hobbynum) OVER (PARTITION BY studentnum) student_hobby_ct 
    FROM hobby) 
SELECT studentnum, student_hobby_ct 
    FROM h h1 JOIN h h2 ON h1.student_hobby_ct = h2.student_hobby_ct AND 
         h1.studentnum <> h2.studentnum; 
+0

有趣 - 我相信會有效。謝謝 - 您能否告訴我爲什麼其他語法不會產生類似的結果? –

+0

此語法的工作原理是基本上正在進行自加入。另一個不是因爲它沒有進行自我加入。 exists關鍵字在許多情況下非常有用,例如防止重複插入。這是不適合你的嘗試。 –

+0

啊 - 我明白了 - 謝謝。 –

1

我認爲,您的查詢會做的是隻返回的學生誰曾在至少一種其他學生是有相同數量的愛好。但是你沒有回報與他們匹配的學生的任何信息。那是故意的嗎?我會將這兩個查詢視爲子查詢並在加入之前進行聚合。你可以做幾件事...在這裏它返回的是具有匹配興趣計數的學生數量,但是可以限制HAVING(COUNT(distinct sb.studentnum)= 0以獲得查詢似乎返回的結果...

with xx as 
(SELECT sa.studentnum, count(ha.hobbynum) hobbycount 
      FROM student sa inner join hobby ha 
      on sa.studentnum = ha.studentnum 
      group by sa.studentnum 
      ) 
select sa.studentnum, sa.hobbycount, count(distinct sb.studentnum) as matchcount 
from 
xx sa inner join xx sb on 
    sa.hobbycount = sb.hobbycount 
where 
    sa.studentnum != sb.studentnum 
GROUP by sa.studentnum, sa.hobbycount 
ORDER BY sa.studentnum; 
+0

啊,我討厭別人在我打字時發佈工作答案。語法也更簡短。 ;-) – Chipmonkey

+0

現在我習慣了。 –