SQL Join многократно (M: N) - PullRequest
       1

SQL Join многократно (M: N)

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

Как я могу объединить одну таблицу с другой таблицей несколько раз в SQL?Наглядный пример:

Таблица «Пар»:

+------+------+------+
|  ID  | ID_1 | ID_2 |
+------+------+------+
|   1  |  123 |  456 |
+------+------+------+

Таблица «Инфо»:

+-----+-----------+-----------+--------+--------+
| ID  | FirstName | LastName  | Gender | Season |
+-----+-----------+-----------+--------+--------+
| 123 | Jon       | Snow      | Male   |      6 |
| 456 | Daenerys  | Targaryen | Female |      6 |
| 123 | Jon       | Targaryen | Male   |      7 |
+-----+-----------+-----------+--------+--------+

А теперь мне нужен комбинированный результат, который должен быть «до даты "( Info.Season должно быть максимально возможным , но вы не можете удалить устаревшие строки):

Желаемый результат:

+-------------+------------+----------+-------------+------------+----------+
| FirstName_1 | LastName_1 | Gender_1 | FirstName_2 | LastName_2 | Gender_2 |
+-------------+------------+----------+-------------+------------+----------+
| Jon         | Targaryen  | Male     | Daenerys    | Targaryen  | Female   |
+-------------+------------+----------+-------------+------------+----------+

Понятия не имею, как решить проблему, чтобы идентификаторы не были уникальными, и мне нужно присоединиться к таблице Info"несколько раз".

1 Ответ

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

Вы можете выбрать самое текущее состояние игрока, используя функцию окна SQL, чтобы упорядочить каждого игрока по season.Затем вам необходимо присоединить информационную таблицу к таблице couples для каждого человека в паре.

actor_latest CTE

ID  FIRSTNAME   LASTNAME    GENDER  SEASON  LAST_CHANGE
123 Jon         Targaryen   Male    7       1
123 Jon         Snow        Male    6       2
456 Daenerys    Targaryen   Female  6       1

Результирующий SQL

with actor_latest (id, firstname,lastname,gender,season, last_change) as (
    select
        id
      , firstname
      , lastname
      , gender
      , season
      , rank() over (partition by id order by season desc) as last_change
    from info
)
select
    left_partner.firstname as firstname_1
  , left_partner.lastname as lastname_1
  , left_partner.gender as gender_1
  , left_partner.season as season_1
  , right_partner.firstname as firstname_2
  , right_partner.lastname as lastname_2
  , right_partner.gender as gender_2
  , right_partner.season as season_2
from
    couples c
    join actor_latest left_partner on c.id_1 = left_partner.id and left_partner.last_change=1
    join actor_latest right_partner on c.id_2 = right_partner.id and left_partner.last_change=1

Результаты

FIRSTNAME_1 LASTNAME_1 GENDER_1 SEASON_1 FIRSTNAME_2    LASTNAME_2  GENDER_2 SEASON_2
Jon         Targaryen  Male     7        Daenerys       Targaryen   Female   6

SQL Fiddle

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