2011-08-18 19 views
2

這是我的問題。我已經在Oracle數據庫中4個表:SQL請求:如何使用多表和計算進行特定選擇?

  • 隊(teamID,teamName)
  • TeamMembers(membersID,teamID,membersStatusID)
  • 成員(membersID,membersName)
  • 狀態(membersStatusID,statusName )

我需要得到teamName,在這些球隊teamMembers的數字,誰的狀態爲「船長」成員的名字......所有這一切都在一個SQL中的。

很多小時在這個沒有解決方案...任何想法?

編輯:我需要看到所有的球隊,即使球隊裏沒有成員。

+1

有每隊只有一個上尉好? –

+0

每隊只有一名隊長或者只有一名隊長 – Malkav

回答

0

我對我的預言有點生疏了,所以這裏可能有一些輕微的語法問題,但我給它一個鏡頭:

SELECT t.teamName, 
    count(*) AS teamMembers, 
    c.membersName as teamCaptain 
FROM team t 
    INNER JOIN TeamMembers tm ON tm.teamID = t.teamID 
    LEFT JOIN Members m ON m.membersID = tm.membersID 
    LEFT JOIN TeamMembers tmc ON tmc.teamID = t.teamID AND tmc.memberStatusID = "Captain" 
    LEFT JOIN Members c ON c.membersID = tmc.membersID 
    GROUP BY t.teamName, c.membersName 

編輯:忘記了GROUP BY線!

+1

很確定你需要某個地方的隊伍。 :) – Randy

+0

是的,我做到了。謝謝。 –

+0

謝謝大家!我看了最後的解決方案,它的工作。我只是用「左連接」替換「INNER JOIN」,讓所有隊伍都選中。最後一個問題是,COUNT(*)總是從1開始。對於沒有成員的團隊,是否可以有「0」? – Malkav

0
select t.team_id, t.teamName, count(tm.teamid), m.membersname 
from team t, teammembers tm, members m, status s 
where t.teamid = tm.teamid (+) 
and tm.membersid = m.membersid (+) 
and m.membersstatusid = s.statusid (+) 
and s.statusname = 'Captain' 
group by t.team_id, t.teamName, m.membersname 
+0

如果你有這句話(和s.statusname ='Captain'),我想你會有一個完整的連接。 – Aitor

0
SELECT 
teamName, 
b.[Number Of Members], 
c.membersName AS [Captian] 
FROM 
Team 
LEFT JOIN 
(
SELECT 
    COUNT(*) AS [Number Of Members], 
    teamID 
FROM 
    TeamMembers 
GROUP BY 
    teamID 
) AS b ON Team.teamID = c.teamID 
LEFT JOIN 
(
SELECT 
    membersName, 
    teamID 
FROM 
    Members 
INNER JOIN 
    TeamMembers ON Members.membersID = TeamMembers.membersID 
INNER JOIN 
    Status ON TeamMembers.memberStatusID = Status.memberStatusID AND Status.statusName = 'Captian' 
) AS c ON c.teamID = Team.teamID 

可能工作。可能需要調整它,因爲b select語句中的組合。此外,我在SQL寫這只是因爲我不知道甲骨文語法

0

我無法現在來測試這個選擇,但你可以試試這個:

select team.teamName,count(distinct members.membersID) numMembers, 
MAX(CASE when status.statusName='CAPTAIN' then members.membersname else null END) Captain 
from team,teammembers,members,status 
where team.teamID=teammembers.teamID(+) 
and teammembers.membersID=members.membersID(+) 
and teamMembers.memberStatusID=status.memberstatusID(+) 
group by team.teamName; 
相關問題