2011-11-11 35 views
3
Student Table 

SID Name 
1  A 
2  B 
3  C 

Marks Table 

id mark subject 
1 50 physics 
2 40 biology 
1 50 chemistry 
3 30 mathematics 



SELECT distinct(std.id),std.name,m.mark, row_number() over() as rownum FROM 

student std JOIN marks m ON std.id=m.id AND m.mark=50 

即使使用disticnt後,此結果也是2倍。我的預期結果將只有一個答:如果我刪除row_number()over()作爲rownum其工作正常。爲什麼發生這種情況?如何解決。 AM使用DB2!如何避免重複加入兩張表

+0

如果你不想在物理學和化學兩方面都考慮A的話,加入Student和Marks的意義何在? – sceaj

+0

我只想要在至少一個科目中獲得50分的學生 – zod

回答

5

標記表中有兩行,id = 1和mark = 50。因此,您將在輸出中爲學生表中的每一行獲取兩行... 如果您只需要一行,則必須執行一組由

SELECT std.id, std.name, m.mark, row_number() 
    over() as rownum 
FROM student std 
    JOIN marks m 
     ON m.id=std.id AND m.mark=50 
Group By std.id, std.name, m.mark 
+0

從不(幾乎)將謂詞放入連接中! – orbfish

+1

總是將連接謂詞放入連接中。 Where子句謂詞不會在整個結果集生成之後才被評估,因此在整個處理過程中會攜帶不需要的行,並且在某些外部連接方案中,將謂詞放在where子句中將生成不正確的結果。最後,在連接中放入連接謂詞會將它們放在他們所關注的表的附近,而不是在最後一起放在一起,這會增加查詢的清晰度。 –

+0

另外,有時您希望多次連接到同一個表,併爲每個連接使用不同的謂詞。你如何在Where子句中做到這一點? –

3

現在你已經澄清你的問題如下:

我想找到的所有學生的50標記的至少一個主題。我將使用以下查詢:

SELECT student.id, '50' 
FROM student 
WHERE EXISTS (SELECT 1 FROM marks WHERE marks.id = student.id AND marks.mark = 50) 

這也使您可以靈活地更改條件,例如,至少一個50或更少的標記。

+0

+1 EXISTS(半連接)是你真正想要做的。您不需要完全加入,因爲您不需要所有額外的數據。這個查詢與完成一個完全連接的額外工作相比更有效率,然後再做更多的額外工作來將數據集修剪到您想要的位置。 –

+0

+1使用WHERE EXISTS,但你忘記了他的rownum專欄。 – orbfish

+0

@orbfish我真的不明白OP用'row_number()over()'來做什麼。 @zod也許你可以澄清? – sceaj

1

與Charles答案類似,但您總是希望將謂詞(標記= 50)置於WHERE子句中,因此您在加入之前進行過濾。如果這只是作業,它可能並不重要,但如果你曾經打過任何真實的數據,你會想記住這一點。

SELECT std.sid, 
     std.name, 
     m.mark, 
     row_number() over() AS rownum 
FROM student std 
     JOIN marks m 
     ON std.sid=m.id 
WHERE m.mark=50 
GROUP BY std.sid, std.name, m.mark 
+0

我發現大多數查詢優化器通常可以找出應用過濾器的最佳時間,而不管子句的位置如何。這是DB2的怪癖嗎? –

+0

@M_M - 否 - DB2(至少在iSeries上)似乎會生成相同的解釋計劃,並且似乎認爲這兩個查詢是等價的(使用相同的訪問路徑);至少像這樣簡單的例子。 @All - 在'WHERE'子句和'JOIN'子句中放置一個條件將不會總是返回相同的結果(當使用'LEFT'和/或'EXCEPTION'連接時,這通常是相關的),所以條件應該放在哪裏它們會生成正確的結果,而不是出於性能原因(DB2優化器也很好)。 –

+0

@M_M - 我在Oracle中很熟悉它。有時它會計算出來,但有時候它會讓你意識到你對SQL的看法,並且會一直持續下去。 – orbfish