我有三個表,我加入它們并使用 where Group by - count,我無法獲得輸出結果為零的國家/地區。我還是迷路了。
這是 SQLfiddle
http://sqlfiddle.com/#!4/e330ec/7
電流輸出
(UKD) 3
(EUR) 2
(USA) 2
(CHE) 1
預期輸出
(UKD) 3
(EUR) 2
(IND) 0
(LAO) 0
(USA) 2
(CHE) 1
uj5u.com熱心網友回復:
您可以RIGHT JOIN按照另一個答案中的建議使用 a ,也可以重新排序連接并使用 a LEFT JOIN:
SELECT
C.COUNTRY_CODE,
COUNT(GAME_TYPE)
FROM
COUNTRY_TABLE C
LEFT JOIN PLAYER_TABLE P ON P.COUNTRY_ID = C.COUNTRY_ID
LEFT JOIN PLAYER_GAME_TYPE G ON P.PLAYER_ID = G.PLAYER_ID
WHERE
G.GAME_TYPE = 'GOLF'
OR G.GAME_TYPE IS NULL
GROUP BY
C.COUNTRY_CODE;
請注意OR G.GAME_TYPE IS NULL在WHERE子句中包含的內容——如果您只有,那么在連接之后G.GAME_TYPE = 'GOLF'將過濾掉所需的結果。
uj5u.com熱心網友回復:
您可以選擇應用以下步驟:
- 將第二個轉換
LEFT JOIN為RIGHT JOIN(因為所需的缺失縮寫COUNTRY_TABLE位于右側) - 通過在子句旁邊取過濾條件(后跟
WHERE子句)成為匹配條件G.GAME_TYPE = 'GOLF'ON
如
SELECT C.COUNTRY_CODE, COUNT(GAME_TYPE)
FROM PLAYER_TABLE P
LEFT JOIN PLAYER_GAME_TYPE G
ON P.PLAYER_ID = G.PLAYER_ID
RIGHT JOIN COUNTRY_TABLE C
ON P.COUNTRY_ID = C.COUNTRY_ID
AND G.GAME_TYPE = 'GOLF'
GROUP BY C.COUNTRY_CODE;
Demo
uj5u.com熱心網友回復:
簡單更改表連接順序即可解決問題
SELECT C.COUNTRY_CODE, COUNT(GAME_TYPE)
FROM COUNTRY_TABLE C -- get all countries
LEFT JOIN PLAYER_TABLE P ON P.COUNTRY_ID = C.COUNTRY_ID -- join all players
LEFT JOIN PLAYER_GAME_TYPE G ON P.PLAYER_ID = G.PLAYER_ID AND G.GAME_TYPE = 'GOLF' -- join only GOLF games
GROUP BY C.COUNTRY_CODE;
在線 sqlize
uj5u.com熱心網友回復:
這是您的查詢:
SELECT C.COUNTRY_CODE, COUNT(GAME_TYPE)
FROM PLAYER_TABLE P
LEFT JOIN PLAYER_GAME_TYPE G ON P.PLAYER_ID = G.PLAYER_ID
LEFT JOIN COUNTRY_TABLE C ON P.COUNTRY_ID = C.COUNTRY_ID
WHERE G.GAME_TYPE = 'GOLF'
GROUP BY C.COUNTRY_CODE;
這個查詢似乎試圖選擇所有球員,即使他們不是高爾夫球手。然而,這不起作用,因為WHERE G.GAME_TYPE = 'GOLF'洗掉了所有外部連接行,所以你最終得到一個內部連接(所有打高爾夫球的球員)。最后你外部加入國家表,這會給你不屬于的球員到一個國家。這是縮進的嗎?我不這么認為。
你想要的是國家,所以從國家中選擇。然后正確地加入玩家和型別以計算他們。
SELECT c.country_code, COUNT(g.game_type) as golfers_in_country
FROM country_table c
LEFT JOIN player_table p ON p.country_id = c.country_id
LEFT JOIN player_game_type g ON g.player_id = p.player_id AND g.game_type = 'GOLF'
GROUP BY c.country_code
ORDER BY c.country_code;
您可以使用 CTE 來提高可讀性。它更長,但使意圖一清二楚。像這樣構建查詢有助于避免錯誤。
WITH golfers AS
(
SELECT *
FROM player_table
WHERE player_id IN
(
SELECT player_id
FROM player_game_type
WHERE game_type = 'GOLF'
)
)
SELECT c.country_code, COUNT(g.player_id) as golfers_in_country
FROM country_table c
LEFT JOIN golfers g ON g.country_id = c.country_id
GROUP BY c.country_code
ORDER BY c.country_code;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/516036.html
標籤:sql甲骨文
下一篇:選擇具有特定條件的用戶ID
