我试图做一个简单的自我联接SQL和一个联接到第二张表,对于我来说,我一辈子都搞不清楚。我已经进行了一些研究,但似乎无法从类似问题中得到答案。该查询适用于在VB.NET中运行的MS-Access。
我有2张桌子:
TodaysTeams
-----------
TeamNum PlayerName PlayerID
------- ---------- --------
1 Mark 100
1 Brian 101
2 Mike 102
2 Mike 102
(请注意,上面的最后2行不是拼写错误。在这种情况下,玩家可以与自己配对以组队)
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
我知道我在返回笛卡尔积(即行太多)时缺少另一个联接。
对于我在这里缺少的内容,我将不胜感激。
谢谢。
答案 0 :(得分:0)
您可以使用聚合:
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;
答案 1 :(得分:0)
尽管戈登建议的方法可以很好地工作,前提是每个团队最多有两名球员,但如果您添加其他团队成员并希望将其显示在单独的列中,该方法就会失效。
难以以一种可以用逻辑描述的方式显示数据但难以使用查询来生成数据的困难通常意味着该数据库结构是次优的。
对于您的特定设置,我个人建议采用以下结构:
+---------------+ +----------+------------+
| 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
为中心的交叉表查询来生成每一列,并且您将不限于两列。