SQL-запрос для получения всех записей с определенными родительскими идентификаторами и двумя дополнительными условиями - PullRequest
0 голосов
/ 28 мая 2019

Итак, я работаю за столом, в котором хранятся разные автобусные маршруты. Каждый маршрут может проходить через различные местоположения (StationId), и порядок, в котором он проходит через каждое из них, определяется столбцом StationOrder.

Таблица выглядит так:

RouteId | StationId | StationOrder |
------------------------------------
1       | 1         | 2
1       | 2         | 3
1       | 4         | 1
3       | 1         | 1
3       | 2         | 3
3       | 3         | 2

Что я знаю, так это маршруты, которые меня интересуют. В данном случае это маршруты с идентификаторами 1 и 3. Я также знаю, что является начальной станцией, StationId 1, что мне нужно выбрать, это все StationIds, которые имеют StationOrder число больше, чем StationOrder число для StationId 1.

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

SELECT RS.StationId FROM RouteStations AS RS
WHERE RS.RouteId IN (1,3)

Но когда дело доходит до второй части, где мне нужно выбрать все StationId с номером StationOrder, большим, чем номер StationOrder для StationId 1 для каждого маршрута, мои знания по SQL заканчиваются.

Ответы [ 4 ]

1 голос
/ 28 мая 2019

В качестве альтернативы ответу @forpas, вы можете сделать соединение с самой таблицей.

SELECT s.StationId 
FROM RouteStationsS s
    INNER JOIN RouteStation s2 on s.RouteId = s2.RouteId and s.StationOrder > s2.StationOrder
WHERE s2.RouteId IN (1, 3) and s2.StationId = 1
1 голос
/ 28 мая 2019

Вы можете сделать это с помощью оконных функций:

select rs.*
from (select rs.*,
             min(case when stationid = 1 then stationorder end) over (partition by routeid) as stationorder_1
      from routestations rs
     ) rs
where routeid in (1, 3) and
      stationorder > stationorder_1;
1 голос
/ 28 мая 2019

мне нужно выбрать все идентификаторы StationId, у которых номер StationOrder больше номера StationOrder для StationId 1

Поместите эти условия в предложение WHERE:

SELECT RS.StationId 
FROM RouteStations AS RS
WHERE 
  RS.RouteId IN (1,3)
  AND
  RS.StationOrder > (
    select StationOrder 
    FROM RouteStations 
    WHERE RouteId = RS.RouteId AND StationId = 1
  )

Если вы не хотите дублировать результаты, используйте:

SELECT DISTINCT RS.StationId 
0 голосов
/ 28 мая 2019

Если идентификатор маршрута не важен, удалите его из встроенного представления ...

SELECT a.*
FROM routes a
JOIN (
        SELECT  routeId
        ,       stationId
        ,       max(stationOrder) maxOrder
        FROM routes
        WHERE stationId = 1
        GROUP BY routeId
        ,        stationId
        ) b ON a.routeId = b.routeId
WHERE a.stationOrder > b.maxOrder
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...