【问题标题】:SQL request : how to make a particular select with multi tables and calcul?SQL 请求:如何使用多表和计算进行特定选择?
【发布时间】:2011-08-19 00:25:40
【问题描述】:

这是我的问题。我在 Oracle 数据库上有 4 个表:

  • 团队(团队 ID,团队名称)
  • TeamMembers(membersID, teamID, membersStatusID)
  • 成员(membersID,membersName)
  • 状态(membersStatusID, statusName)

我需要在 SQL 中获取teamNameteamMembers 在这些团队中的编号以及具有“队长”状态的成员的姓名......所有这些都在一个SELECT 中。

在这个问题上花了好几个小时,但没有解决方案......有什么想法吗?

编辑:我需要查看所有团队,即使其中没​​有成员。

【问题讨论】:

  • 每队只有一名队长吗??
  • 每队没有队长或只有1名队长

标签: sql oracle


【解决方案1】:

我的 oracle 有点生疏,所以这里可能存在一些轻微的语法问题,但我会试一试:

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 行!

【讨论】:

  • 很确定你在某个地方需要一个小组。 :)
  • 谢谢大家!我看过最后一个解决方案,它的工作原理。我刚刚用“LEFT JOIN”替换了“INNER JOIN”,让所有团队都在选择中。最后一个问题,COUNT(*) 总是从 1 开始。没有成员的团队是否可以有“0”?
  • 尝试用 count(m.membersID) 替换 count(*)
【解决方案2】:
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

【讨论】:

  • 如果你有这句话(和 s.statusname = 'Captain'),我想你会有一个完整的加入。
【解决方案3】:

我现在无法测试这个选择,但你可以试试这个:

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;

【讨论】:

    【解决方案4】:
    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 语句中的 group by ,可能需要对其进行调整。另外我只在sql中写了这个,因为我不知道oracle语法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-07
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多