Выберите запрос для 3 соединяющихся таблиц - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть 2 таблицы: таблица полета и таблица вылета со следующим

Table flight:

flightnr|   dest    |   start
        |           |
--------------------------------
        |           |
LH100   |   ATL     |   FRA
LH102   |   DXB     |   FRA
LH103   |   ORD     |   FRA
LH104   |   HND     |   FRA
LH105   |   LHR     |   FRA
LH106   |   LAX     |   FRA
LH107   |   HKG     |   FRA
LH108   |   CDG     |   FRA
LH109   |   DFW     |   FRA
LH110   |   IST     |   FRA
LH200   |   ATL     |   LHR
LH201   |   PEK     |   LHR
LH202   |   DXB     |   LHR
LH203   |   ORD     |   LHR
LH204   |   FRA     |   LHR

, а другая таблица -

Table departure:

flightnr|   date        |   sign
        |               |
---------------------------------------
        |               |
LH-100  |   2018-01-10  |   D-ABBL
LH-100  |   2018-02-10  |   D-ABBL
LH-100  |   2018-03-10  |   D-ABBL
LH-100  |   2018-04-10  |   D-ABBL
LH-100  |   2018-05-10  |   D-ABBL
LH-100  |   2018-06-10  |   D-ABBL
LH-100  |   2018-07-10  |   D-ABBK
LH-100  |   2018-08-10  |   D-ABBK
LH-102  |   2018-02-10  |   D-ABBB
LH-102  |   2018-04-10  |   D-ABBB
LH-102  |   2018-06-10  |   D-ABBB
LH-103  |   2018-09-10  |   D-ABBB
LH-104  |   2018-03-10  |   D-ABBB
LH-104  |   2018-05-10  |   D-ABBB
LH-104  |   2018-07-10  |   D-ABBB
LH-104  |   2018-09-10  |   D-ABBB
LH-105  |   2018-01-10  |   D-ABBB
LH-105  |   2018-02-10  |   D-ABBB
LH-105  |   2018-03-10  |   D-ABBB
LH-200  |   2018-01-10  |   D-ABCA
LH-200  |   2018-02-10  |   D-ABCA
LH-201  |   2018-03-10  |   D-ABCA
LH-201  |   2018-05-10  |   D-ABBR
LH-202  |   2018-05-10  |   D-ABCA
LH-202  |   2018-09-10  |   D-ABCA
LH-203  |   2018-04-10  |   D-ABCA
LH-203  |   2018-05-10  |   D-ABCA
LH-203  |   2018-06-10  |   D-ABCC
LH-204  |   2018-01-10  |   D-ABBF
LH-204  |   2018-03-10  |   D-ABBI
LH-204  |   2018-08-10  |   D-ABBM

Так что теперь я хочу выбрать строки, которыедайте мне возможность лететь из иата 'FRA' в 'PEK', что невозможно в 1 вылет, потому что в вылете из таблицы нет прямого рейса из 'FRA' в 'PEK'.

Какклиент, которому я должен вначале перелететь из «FRA» в «LHR», чтобы после этого я мог перелететь из «LHR» в «PEK».

Теперь моя проблема в том, что я действительно не знаю, каквыберите линии, которые дают мне возможность перелета из «FRA» в «PEK».Вывод должен выглядеть примерно так:

   date    | flightnr | start | change_over_dest |   date    | flightnr | change_over_start | dest
------------+--------+-------+--------------+------------+--------+---------------+------
 2018-03-10| LH-105   | FRA   | LHR              | 2018-03-10| LH-201   | LHR               | PEK
 2018-03-10| LH-105   | FRA   | LHR              | 2018-05-10| LH-201   | LHR               | PEK

Я уже пробовал много разных версий использования JOINS между двумя таблицами (использовал 2 JOINS, чтобы соединить рейс с самим собой, а затем с вылетом), но ни один из них почти не работал

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

Привет

Zeroza

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018
DROP TABLE IF EXISTS fight;

CREATE TABLE flight
(flightnr CHAR(5) NOT NULL PRIMARY KEY
,destination CHAR(3) NOT NULL
,start CHAR(3) NOT NULL
);

INSERT INTO flight VALUES
('LH100','ATL','FRA'),
('LH102','DXB','FRA'),
('LH103','ORD','FRA'),
('LH104','HND','FRA'),
('LH105','LHR','FRA'),
('LH106','LAX','FRA'),
('LH107','HKG','FRA'),
('LH108','CDG','FRA'),
('LH109','DFW','FRA'),
('LH110','IST','FRA'),
('LH200','ATL','LHR'),
('LH201','PEK','LHR'),
('LH202','DXB','LHR'),
('LH203','ORD','LHR'),
('LH204','FRA','LHR');

DROP TABLE IF EXISTS departure;

CREATE TABLE departure
(flightnr CHAR(5) NOT NULL
,date DATE NOT NULL
,sign CHAR(6) NOT NULL
,PRIMARY KEY(flightnr,date)
);

INSERT INTO departure VALUES
('LH100','2018-10-01','D-ABBL'),
('LH100','2018-10-02','D-ABBL'),
('LH100','2018-10-03','D-ABBL'),
('LH100','2018-10-04','D-ABBL'),
('LH100','2018-10-05','D-ABBL'),
('LH100','2018-10-06','D-ABBL'),
('LH100','2018-10-07','D-ABBK'),
('LH100','2018-10-08','D-ABBK'),
('LH102','2018-10-02','D-ABBB'),
('LH102','2018-10-04','D-ABBB'),
('LH102','2018-10-06','D-ABBB'),
('LH103','2018-10-09','D-ABBB'),
('LH104','2018-10-03','D-ABBB'),
('LH104','2018-10-05','D-ABBB'),
('LH104','2018-10-07','D-ABBB'),
('LH104','2018-10-09','D-ABBB'),
('LH105','2018-10-01','D-ABBB'),
('LH105','2018-10-02','D-ABBB'),
('LH105','2018-10-03','D-ABBB'),
('LH200','2018-10-01','D-ABCA'),
('LH200','2018-10-02','D-ABCA'),
('LH201','2018-10-03','D-ABCA'),
('LH201','2018-10-05','D-ABBR'),
('LH202','2018-10-05','D-ABCA'),
('LH202','2018-10-09','D-ABCA'),
('LH203','2018-10-04','D-ABCA'),
('LH203','2018-10-05','D-ABCA'),
('LH203','2018-10-06','D-ABCC'),
('LH204','2018-10-01','D-ABBF'),
('LH204','2018-10-03','D-ABBI'),
('LH204','2018-10-08','D-ABBM');

SELECT f1.flightnr
     , f1.start
     , d1.date startdate
     , f2.flightnr transferflightnr
     , f2.start transferlocation
     , d2.date transferdate
     , f2.destination 
  FROM flight f1 
  JOIN departure d1 
    ON d1.flightnr = f1.flightnr 
  JOIN flight f2 
    ON f2.start = f1.destination 
  JOIN departure d2 
    ON d2.flightnr = f2.flightnr 
   AND d2.date >= d1.date 
 WHERE f2.destination = 'pek' 
   AND f1.start = 'fra';
+----------+-------+------------+------------------+------------------+--------------+-------------+
| flightnr | start | startdate  | transferflightnr | transferlocation | transferdate | destination |
+----------+-------+------------+------------------+------------------+--------------+-------------+
| LH105    | FRA   | 2018-10-01 | LH201            | LHR              | 2018-10-03   | PEK         |
| LH105    | FRA   | 2018-10-02 | LH201            | LHR              | 2018-10-03   | PEK         |
| LH105    | FRA   | 2018-10-03 | LH201            | LHR              | 2018-10-03   | PEK         |
| LH105    | FRA   | 2018-10-01 | LH201            | LHR              | 2018-10-05   | PEK         |
| LH105    | FRA   | 2018-10-02 | LH201            | LHR              | 2018-10-05   | PEK         |
| LH105    | FRA   | 2018-10-03 | LH201            | LHR              | 2018-10-05   | PEK         |
+----------+-------+------------+------------------+------------------+--------------+-------------+
0 голосов
/ 06 декабря 2018

Мы можем попытаться выполнить самостоятельное соединение для таблицы flight с условием, что первый пункт назначения является началом второго маршрута.Кроме того, мы можем ограничить начальный и конечный города назначения.Обратите внимание, что мы также присоединяем к каждой таблице flight таблицу departure, чтобы ввести даты отправления.

SELECT
    d1.date AS date_start,
    f1.flightnr AS flightnr_start,
    f1.start AS first_start,
    f1.dest AS change_over_dest,
    d2.date AS date_end,
    f2.flightnr AS flightnr_end,
    f2.start AS last_start,
    f2.dest AS change_over_end
FROM flight f1
INNER JOIN departure d1
    ON f1.flightnr = d1.flightnr
INNER JOIN flight f2
    ON f1.dest = f2.start
INNER JOIN departure d2
    ON f2.flightnr = d2.flightnr AND d1.date = d2.date
WHERE
    f1.start = 'FRA' AND f2.dest = 'PEK';

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

Демо

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