2012-05-17 136 views
1

我有一個任務,我需要編寫一個SQL查詢,它將檢索玩家數量以及支付玩家總費用並支付總額超過80英鎊的玩家總額罰款。SQL查詢,加入多個表,Oracle

我有三個表

播放器(playerNo,名,縮寫,街道,鎮,郵編)

隊(teamNo,playerNo,師)

處罰( paymentNo,playerNo,penDate,amount)

粗體文本表示主鍵。球隊表中的球員號碼錶示球隊隊長。

我不知道如何加入三張表。但我的嘗試是這樣的:

SELECT p1.playerNo, SUM(p2.amount) 
FROM Players p1 INNER JOIN Teams t 
    ON p1.playerNo = t.playerNo 
JOIN penalties p2 
    ON p2.playerNo = p1.playerNo 
GROUP BY playerNo 
HAVING SUM(p2.amount) > 80; 

這是正確的嗎?

+0

你的表格是有點奇怪...'teams'不應引用'players','players'應引用'teams'。 –

+0

我不知道該查詢上的「團隊」表格是什麼,因爲它不在選擇上而在篩選器上。 –

+0

,因爲在球隊表中,球員沒有代表球隊隊長,而我只是試圖選擇只是球隊隊長的球員。 – Ivan

回答

4
SELECT a.playerNo, a.playerName, SUM(c.amount) as amount, b.teamNo as Team 
FROM players a, teams b, penalties c 
WHERE a.playerNo = b.playerNo and a.playerNo = c.playerNo 
Group By a.playerNo, c.teamNo 
Having sum.... 
1

您的查詢看起來是正確的,可以返回所需內容。如果同一個球員是不止一支球隊的隊長,這確實會帶來怎樣的問題,但這可能不會發生。

你想對數據庫結構發表評論嗎?

0

如果玩家不能成爲多個團隊的隊長,那麼您的查詢是正確的。它只需要您將GROUP BY playerNo替換爲GROUP BY p1.playerNo

但是,如果一名球員可以成爲不止一支球隊的隊長,將會返回錯誤的結果。這會給你一個正確的答案,在任何情況下:

SELECT p1.playerNo, SUM(p2.amount) 
FROM Players p1 
    JOIN penalties p2 
    ON p2.playerNo = p1.playerNo 
WHERE EXISTS 
     (SELECT * 
     FROM Teams t 
     WHERE p1.playerNo = t.playerNo 
    ) 
GROUP BY p1.playerNo 
HAVING SUM(p2.amount) > 80; 
0
select captaion_number , sum (amount) total_amount 
from (select t.playes.no captaion_number , p.amount amount 
from teams t , Penalties p 
where t.player_no = p.player_no) 
group by captaion_number 
having total_amount > 80 ;