SQL on Self Table Join - PullRequest
       2

SQL on Self Table Join

0 голосов
/ 24 июня 2019

Я пытаюсь сделать простой SQL самообъединения и соединение со 2-ой таблицей, и я не могу понять это на всю жизнь.Я провел некоторое исследование и не могу подобрать ответ на подобные вопросы.Этот запрос для MS-Access работает в VB.NET.

У меня есть 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 голосов
/ 24 июня 2019

Хотя предложенный метод Гордона будет работать хорошо, при условии, что в команде не более двух игроков, метод не работает, если вы добавите другого члена команды и захотите отобразить их в отдельной колонке.

Сложностьпри отображении данных способом, который вы можете описать логически, но который не может быть легко получен с использованием запроса, обычно подразумевается, что структура базы данных является субоптимальной.

Для вашей конкретной настройки я лично рекомендую следующую структуру:

+---------------+           +----------+------------+
|    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, чтобы получить каждый из ваших столбцов, и вы не будете ограничены двумя столбцами.

0 голосов
/ 24 июня 2019

Вы можете использовать агрегацию:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...