2014-01-27 58 views
1

我有一個小問題,用下面的查詢:甲骨文計數不顯示0

SELECT 
    country.country_id AS "COUNTRY_ID", count(con.medal_id) AS "GOLD" 
FROM 
    country country 
LEFT OUTER JOIN 
    contestant con on con.country_id = country.country_id 
AND con.medal_id = 1 
LEFT OUTER JOIN 
    event e on e.event_id = con.event_id 
WHERE e.og_id = 1 
GROUP BY 
    country.country_id 
ORDER BY 
    country.country_id 

我試圖讓我的查詢,顯示如下所示:

COUNTRY_ID  GOLD 
---------- ---------- 
     1   1 
     2   2 
     3   0 
     4   0 

然而,我目前的查詢,其顯示的:

COUNTRY_ID  GOLD 
---------- ---------- 
     1   1 
     2   2 

如果我改變WHERE e.og_id = 1AND e.go_id = 1

結果將是以下:

COUNTRY_ID  GOLD 
---------- ---------- 
     1   1 
     2   5 
     3   0 
     4   3 

這個結果等於沒有這條線:

LEFT OUTER JOIN 
    event e on e.event_id = con.event_id 
AND e.og_id = 1 

如果有人需要更多信息,請讓我知道。

謝謝你的幫助。

+0

我真的很想,給雙方人民的蜱,但因爲我得到了通過修改弗蘭克的代碼的答案,所以我給他打了勾。再次感謝所有幫助 – fireboy0526

回答

2

移動條款e.og_id = 1到JOIN應該做的伎倆:

SELECT 
    country.country_id AS "COUNTRY_ID", count(con.medal_id) AS "GOLD" 
FROM 
    country country 
LEFT OUTER JOIN contestant con 
    on con.country_id = country.country_id AND con.medal_id = 1 
LEFT OUTER JOIN event e 
    on e.event_id = con.event_id AND e.og_id = 1 
GROUP BY 
    country.country_id 
ORDER BY 
    country.country_id 

或者,您可以明確允許空值:

SELECT 
    country.country_id AS "COUNTRY_ID", count(con.medal_id) AS "GOLD" 
FROM 
    country country 
LEFT OUTER JOIN contestant con 
    on con.country_id = country.country_id AND con.medal_id = 1 
LEFT OUTER JOIN event e 
    on e.event_id = con.event_id 
WHERE e.og_id = 1 or e.og_id IS NULL 
GROUP BY 
    country.country_id 
ORDER BY 
    country.country_id 
+0

我嘗試過對'e.og_id'使用AND,但是這並沒有奏效。我試過你的第二種方法,但它只顯示國家1,2,3而不是4.我可以修復它的任何可能的方法?如果你需要更多的信息,請讓我知道。 – fireboy0526

+0

@ fireboy0526然後添加樣本數據到您的問題。 –

+0

花了一些時間修改你的代碼後,我終於開始工作了。 – fireboy0526

1

有WHERE會過濾掉創建空值由左連接。移動where到加盟條件:

SELECT 
    country.country_id AS "COUNTRY_ID", count(con.medal_id) AS "GOLD" 
FROM 
    country country 
     LEFT OUTER JOIN contestant con 
     on con.country_id = country.country_id 
     AND con.medal_id = 1 
    LEFT OUTER JOIN 
     event e on e.event_id = con.event_id 
     AND e.og_id = 1 
GROUP BY 
    country.country_id 
ORDER BY 
    country.country_id; 

或者,移動過濾器放回where子句,處理在LEFT JOIN返回NULL值的情況。

country country 
     LEFT OUTER JOIN contestant con 
     on con.country_id = country.country_id 
    LEFT OUTER JOIN 
     event e on e.event_id = con.event_id 
    WHERE 
     (con.country_id IS NULL OR con.medal_id = 1) 
     AND 
     (e.event_id IS NULL OR e.og_id = 1) 

更多關於這behaviour here

+0

嘿,那裏,謝謝你的回覆。我已經嘗試了兩種方法,並且在回答上面的問題時,第一個不起作用。它仍不會將'e.og_id'部分放入​​查詢中。 第二個將只顯示國家1,2,3而不是4.是否有任何其他方式來解決它?你需要我提供更多信息嗎? – fireboy0526

+0

2個查詢應該是等效的。我在這裏添加了一個[SqlFiddle](http://sqlfiddle.com/#!4/69127/4)和一些我能想到的邊緣案例的測試數據,它似乎可行。思考? – StuartLC

+0

我使用的是oracle sql開發者,出於某種原因,我認爲代碼也應該起作用。我不明白爲什麼它可以打電話給3個國家,而不是最後一個國家....是的,你的例子足夠好。另外,我不明白爲什麼移動到JOIN的位置並不能解決問題......將它移動到JOIN看起來像JOIN查詢只是被忽略... – fireboy0526