АБ
Алексей Беляев

Люди, знающие SQL, помогите сделать запрос.







Запрос:
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));

Похожие вопросы
Помогите задать запрос в sql?
Помогите составить SQL запрос.
Помогите составить SQL запрос
помогите с sql запросом
Помогу составить SQL запрос
Помогите с запросом по SQL.
Помогите написать SQL запрос
помогите написать запрос на sql
Помогите составить запрос SQL
sql помогите написать запрос