[英]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 |
+--------+--------------+----------+
使用此方法,您可以使用条件聚合或在TeamPlayerID
上TeamPlayerID
的交叉表查询来生成每个列,并且您不会限制为两列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.