自我表联接上的SQL

时间:2019-06-24 14:58:34

标签: sql ms-access

我试图做一个简单的自我联接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

我知道我在返回笛卡尔积(即行太多)时缺少另一个联接。

对于我在这里缺少的内容,我将不胜感激。

谢谢。

2 个答案:

答案 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为中心的交叉表查询来生成每一列,并且您将不限于两列。