Как назвать разные столбцы с одинаковыми ссылками в PostgreSQL? - PullRequest
1 голос
/ 12 февраля 2020

У меня есть таблица routes, которая выглядит следующим образом:

 id | start_point | end_point
----+-------------+-----------
  1 |           1 |         2
  2 |           1 |        10
  3 |           2 |         1
  4 |           2 |         5
  5 |           2 |         9
  9 |           4 |         5
 10 |           5 |         2
 11 |           5 |         4
 12 |           5 |         8
 14 |           7 |         8
...

И start_point, и end_point относятся к столбцу location из таблицы airports:

Foreign-key constraints:
    "routes_end_point_fkey" FOREIGN KEY (end_point) REFERENCES airports(id) ON DELETE CASCADE
    "routes_start_point_fkey" FOREIGN KEY (start_point) REFERENCES airports(id) ON DELETE CASCADE

airports:

  Column  |         Type          | Collation | Nullable |               Default
----------+-----------------------+-----------+----------+--------------------------------------
 id       | bigint                |           | not null | nextval('airports_id_seq'::regclass)
 location | character varying(20) |           | not null |

Есть ли способ создать запрос, который заменит значения start_point и end_point для значений из location, используя соединения (или любое другое решение ), поэтому результат будет выглядеть примерно так:

 id | start_point | end_point
----+-------------+-----------
  1 |    New York |    Moscow
  2 |    New York |     Tokyo
  3 |      Moscow |  New York
  4 |      Moscow |      Rome
...

Все, что я сейчас могу сделать, - это напечатать результаты как start_point, так и end_point в одном столбце с этим запросом:

select location as departure_point from airports join routes on airports.id = routes.start_point
    union all
select location as destination from airports join routes on airports.id = routes.end_point;

Так это выглядит так:

 location
----------
 New York 
 New York 
 Moscow   
 Moscow   
...
 Moscow   
 Tokyo    
 New York 
 Rome     
...

Есть предложения?

1 Ответ

4 голосов
/ 12 февраля 2020

Вы можете присоединиться к таблице airports дважды: один раз, чтобы получить местоположение начальной точки, в другой раз, чтобы получить местоположение конечной точки:

select 
    r.id,
    s.location start_point,
    e.location end_point
from routes r
inner join airports s on s.id = r.start_point
inner join airports e on e.id = r.end_point
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...