Как объединить два столбца один под другим в SQLite? - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть запрос в SQLite, чтобы получить все станции на маршруте поезда, который, в конце, позволяет мне с двумя столбцами с именами ORI_STATION_ID и ORIG_STATION_ID, как на изображении:

enter image description here

Это мой текущий запрос (ORDER_COL не отображается в таблице результатов, он используется только для заказа):

SELECT table_3.ORI_STATION_ID, table_3.DEST_STATION_ID
    FROM table_1
    INNER JOIN table_2
    ON table_2.ID = table_1.ID
    INNER JOIN table_3
    ON table_3.ID = table_2.ID
    WHERE table_1.CODE = "DINO"
    ORDER BY ORDER_COL ASC

Я хочу получить все станций на маршруте поезда, от первого до последнего. Здесь первый с идентификатором 1, а последний с идентификатором 19.

Я мог бы взять первый столбец и быть готовым к go, но тогда я бы пропустил последнюю станцию. Если бы я взял второй столбец, я бы пропустил первую станцию.

Что я хочу сделать: объедините две колонки в одну, расположив одну под другой, и удалите дублированные станции, так что мой ALL_STATIONS_COLUMN выглядел бы так:

| ALL_STATIONS_COLUMN |
-----------------------
|          1          |
|          2          |
|          9          |
|         10          |
|         11          |
|         19          |

В других постах я видел, как использовать объединения для объединения таблиц или CONCAT (но, похоже, это не подходит для SQLite), но не нашел правильного пути.

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Запрос объединения может быть здесь одним из вариантов:

SELECT t3.ORI_STATION_ID AS ALL_STATIONS_COLUMN
FROM table_1 t1
INNER JOIN table_2 t2 ON t2.ID = t1.ID
INNER JOIN table_3 t3 ON t3.ID = t2.ID
WHERE t1.CODE = 'DINO'
UNION
SELECT t3.DEST_STATION_ID
FROM table_1 t1
INNER JOIN table_2 t2 ON t2.ID = t1.ID
INNER JOIN table_3 t3 ON t3.ID = t2.ID
WHERE t1.CODE = 'DINO'
ORDER BY ALL_STATIONS_COLUMN;

Это убивает двух птиц одновременно (сплат), потому что объединение объединяет идентификаторы станции отправителя и пункта назначения, а также удаляет повторяющиеся значения если они происходят между двумя наборами.

0 голосов
/ 14 февраля 2020

Звучит как случай для рекурсивного CTE (Пример использует только вашу итоговую таблицу маршрутов; я не собираюсь пытаться придумать данные из трех таблиц; легко расширить следующее с помощью запроса, который вычисляет этот маршрут как другой CTE):

WITH cte AS
 (SELECT 1 AS all_stations_column, 1 AS stop
  UNION
  SELECT r.dest_station_id, cte.stop + 1
  FROM route AS r
  JOIN cte ON r.ori_station_id = cte.all_stations_column)
SELECT all_stations_column FROM cte ORDER BY stop;

, давая

all_stations_column
-------------------
1
2
9
10
11
19

Пример dbfiddle

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