繁体   English   中英

自我表连接上的SQL

[英]SQL on Self Table Join

我正在尝试做一个简单的自连接SQL和第二个表的连接,对于我的生活,我无法弄明白。 我做了一些研究,似乎无法从类似的问题中找到答案。 此查询适用于在VB.NET中运行的MS-Access。

我有2张桌子:

TodaysTeams
-----------
TeamNum  PlayerName PlayerID
-------  ---------- --------
   1     Mark       100
   1     Brian      101
   2     Mike       102
   2     Mike       102

(注意上面的最后两行不是拼写错误。在这种情况下,玩家可以与自己配对组成一个团队)

TodaysTeamsPoints
-----------------
TeamNum    Points
-------    ------
   1         90
   2         85

我想要的结果是(2行,每队1个):

TeamNum  PlayerName1  PlayerName2  Points
-------  -----------  -----------  ------
   1     Mark         Brian          90
   2     Mike         Mike           85

这是我的SQL:

SELECT DISTINCT A.TeamNum, A.PlayerName as PlayerName1, B.PlayerName    AS PlayerName2, C.Points
FROM            ((TodaysTeams A INNER JOIN
                     TodaysTeamsPoints C ON A.TeamNum = C.TeamNum)    INNER JOIN
                     TodaysTeams B ON A.TeamNum = B.TeamNum)
ORDER BY C.Points DESC

我知道我错过了另一个连接,因为我正在返回笛卡尔产品(即太多行)。

我很感激帮助我在这里缺少什么。

谢谢。

您可以使用聚合:

SELECT ttp.TeamNum, MIN(tt.PlayerName) as PlayerName1, 
       MAX(tt.PlayerName) as PlayerName2,
       ttp.Points
FROM TodaysTeamsPoints as ttp INNER JOIN
     TodaysTeams as tt 
     ON tt.TeamNum = ttp.TeamNum
GROUP BY ttp.TeamNum, ttp.Points
ORDER BY ttp.Points DESC;

虽然Gordon建议的方法可以很好地工作,但每个团队最多只有两个玩家,如果你添加另一个团队成员并希望在一个单独的列中显示它们,该方法就会崩溃。

以您可以逻辑描述但不能使用查询轻松生成的方式显示数据的困难通常意味着数据库结构是次优的。

对于您的特定设置,我个人会推荐以下结构:

+---------------+           +----------+------------+
|    Players    |           | PlayerID | PlayerName |
+---------------+           +----------+------------+
| PlayerID (PK) |           |      100 | Mark       |
| PlayerName    |           |      101 | Brian      |
+---------------+           |      102 | Mike       |
                            +----------+------------+
+-------------+             +--------+----------+
|    Teams    |             | TeamID | TeamName |
+-------------+             +--------+----------+
| TeamID (PK) |             |      1 | Team1    |
| TeamName    |             |      2 | Team2    |
+-------------+             +--------+----------+
+-------------------+       +--------+--------------+----------+
|    TeamPlayers    |       | TeamID | TeamPlayerID | PlayerID |
+-------------------+       +--------+--------------+----------+
| TeamID (PK)       |       |      1 |            1 |      100 |
| TeamPlayerID (PK) |       |      1 |            2 |      101 |
| PlayerID (FK)     |       |      2 |            1 |      102 |
+-------------------+       |      2 |            2 |      102 |
                            +--------+--------------+----------+

使用此方法,您可以使用条件聚合或在TeamPlayerIDTeamPlayerID的交叉表查询来生成每个列,并且您不会限制为两列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM