我正试着做一个简单的自连接SQL和一个连接到第二个表的连接,但无论如何我都搞不懂。我做了一些研究,似乎无法从类似的问题中找到答案。此查询针对在VB.NET中运行的MS-Access。
我有两张桌子:
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
我知道我错过了另一个连接,因为我正在返回一个笛卡尔产品(即太多的行)。
对于我在这里遗漏的东西,我将不胜感激。
谢谢。
发布于 2019-06-24 15:12:35
您可以使用聚合:
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;
发布于 2019-06-24 17:17:34
虽然戈登建议的方法将很好地工作,假设每个团队最多有两个球员,但如果您添加另一个团队成员并希望在单独的列中显示他们,该方法就会崩溃。
以一种您可以在逻辑上描述但不容易使用查询生成的方式显示数据的困难通常意味着数据库结构不是最优的。
对于您的特定设置,我个人推荐以下结构:
+---------------+ +----------+------------+
| 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
上使用条件聚合或交叉表查询旋转来生成您的每一列,并且您不会被限制为两列。
https://stackoverflow.com/questions/56739292
复制