Запрос:
Cписок остановок, которые находятся на заданных маршрутах и автобусы, которых на них останавливаются.
Пояснения:
1) Остановки должны находиться хотя бы на одном из заданных маршрутов.
2) Выведенные автобусы должны находиться на этих же маршрутах (можно вывести и все автобусы на остановках, а не только на этих маршрутах) .
3) Использовать только кореллированные подзапросы. Нельзя использовать JOIN, точки и т. д.
Вот мой максимум:
select stop, bus
from
(
select
n_bus as bus,
(select name_stop from stops) as stop,
(select n_route from routes) as route
from buses
where
(id_r in (select id from routes))
and
(id_r in (select id_r from rs where id_s in (select id from stops)))
) as bsr
where (route = 32) or (route = 71)
Выдаёт ошибку:
Lookup Error - MySQL Database Error: Subquery returns more than 1 row
Прошу помочь составить запрос и понять, что значит данная ошибка. Заранее благодарен.
> понять, что значит данная ошибка
Эта ошибка означает, что в выражении
(select name_stop from stops) as stop
запрос должен возвращать только одну запись, ведь это значение поля, в которое засунуть набор записей невозможно. То же самое и с выражением
(select n_route from routes) as route
> Прошу помочь составить запрос
Не совсем понятно, что имеется в виду под "Использовать только кореллированные подзапросы". Без связи между автобусами и остановками мы получим в лучшем случае декартово произведение множеств автобусов и остановок, которые имеют отношение к заданным маршрутам. Вряд ли это то, что требуется.
Ну а со связью можно сделать так:
SELECT stops.name_stop as stop, buses.n_bus as bus
FROM stops, buses, (SELECT id_r, id_s FROM [r-s] WHERE id_r IN
(SELECT id FROM routes WHERE n_route IN (32, 71))) as rs
WHERE stops.id = rs.id_s AND buses.id_r = rs.id_r;
Последнее условие WHERE как раз и задаёт связь между автобусами и остановками.
Но в таком варианте отсутствуют остановки, на которых не останавливается ни один автобус. Чтобы их учесть, надо использовать UNION. Чтобы не повторять условие на маршруты, изменим первоначальный запрос:
SELECT stop, bus
FROM
(SELECT rs.id_r, stops.name_stop as stop, buses.n_bus as bus
FROM [r-s] as rs, stops, buses
WHERE stops.id = rs.id_s AND buses.id_r = rs.id_r)
WHERE id_r IN (SELECT id FROM routes WHERE n_route IN (32, 71));
Теперь добавим те записи, для которых отсутствует автобус на данном маршруте:
SELECT stop, bus
FROM
(SELECT rs.id_r, stops.name_stop as stop, buses.n_bus as bus
FROM [r-s] as rs, stops, buses
WHERE stops.id = rs.id_s AND buses.id_r = rs.id_r
UNION
SELECT rs.id_r, stops.name_stop as stop, NULL as bus
FROM [r-s] as rs, stops
WHERE stops.id=rs.id_s AND NOT EXISTS (SELECT id FROM buses WHERE id_r=rs.id_r))
WHERE id_r IN (SELECT id FROM routes WHERE n_route IN (32, 71));