Oracle Select Query для той же таблицы (самостоятельное соединение) - PullRequest
0 голосов
/ 08 октября 2018

Это кажется простым, но не дает желаемых результатов

У меня есть таблица с этими данными

Team_id, Player_id, Player_name Game_cd
1            100     abc        24
1            1000    xyz        24
1            588     ert        24
1            500     you        24
2            600     ops        24
2            700     dps        24
2            900     lmv        24
2            200     hmv        24

Мне нужно написать запрос, чтобы получить такой результат

Home_team home_plr_id home_player away_team away_plr_id away_player
1            100       abc          2         600         ops
1            1000      xyz          2         900         lmv

Запрос, который я написал

select f1.Team_id as home_team, 
        f1.player_id as home_plr_id,
        f1.player_Name as home_player,
        f2.Team_id as away_team, 
        f2.player_id as away_plr_id,
        f2.player_Name as home_player

from game f1, game f2
where 
f1.team_id<> f2.team_id and
f1.game_cd = f2.game_cd

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Альтернатива самосоединению @ Radagast81 - pivot, доступно в вашей версии Oracle:

select home_plr_id, home_plr_name,  away_plr_id, away_plr_name
  from (select game.*, 
               row_number() over (partition by team_id order by player_id) rn 
          from game)
  pivot (max(player_id) plr_id, max(player_name) plr_name 
         for team_id in (1 home, 2 away))

SQL Fiddle

Игроки должны быть пронумерованы как-то (здесь по ID), это может быть сделано по имени, нулю или даже случайно.Эта нумерация нужна только для размещения их в одинаковых строках.Pivot работает также, если количество игроков в командах отличается.

0 голосов
/ 08 октября 2018

Непонятно, как вы хотите связать домашнего игрока с выездным игроком.Но при условии, что вас это не волнует, вам может понадобиться следующее:

WITH game_p AS (SELECT team_id, player_id, player_name, game_cd
                     , ROW_NUMBER() over (PARTITION BY team_id, game_cd ORDER BY player_id) pos
                     , dense_rank() over (PARTITION BY game_cd ORDER BY team_id) team_pos 
                  FROM game) 
SELECT NVL(f1.game_cd, f2.game_cd) AS game_cd
     , f1.Team_id as home_team
     , f1.player_id as home_plr_id
     , f1.player_Name as home_player
     , f2.Team_id as away_team
     , f2.player_id as away_plr_id
     , f2.player_Name as away_player
  FROM (SELECT * FROM game_p WHERE team_pos = 1) f1
  FULL JOIN (SELECT * FROM game_p WHERE team_pos = 2) f2
  ON f1.game_cd = f2.game_cd
  AND f1.pos = f2.pos

Новый столбец POS дает любому игроку каждой команды возможность связать их с другими игроками.команда.Новый столбец TEAM_POS предназначен для отображения team_id на значения 1 и 2, поскольку значения team_id могут различаться в зависимости от игры.

Наконец, выполните FULL JOIN, чтобы получить окончательный список.Если количество игроков всегда одинаково для обеих команд, вы можете вместо этого сделать нормальное объединение ...

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