Андрей
Высший разум
(480422)
4 года назад
Номер билета уникален в tickets. А в ticket_flights уникальной является комбинация номера билета и номера рейса. В результате ты получаешь совпадающие номера билетов РАЗНЫХ рейсов.
Сам запрос, мягко говоря, неудачен: для таких вещей надо использовать JOIN, ORDER BY 1 не имеет никакого смысла, но замедляет запрос.
SELECT
t.passenger_name,
t.ticket_no,
tf.amount FROM ticket_flights tf
FROM tickets t
LEFT JOIN ticket_flights tf
ON tf.ticket_no = t.ticket_no
WHERE t.passenger_name LIKE 'OLGA%';
Борис БрянцевПрофи (624)
4 года назад
Все, теперь понимаю, а такого результаты мне нужно добиться именно с помощью подзапроса, потому что это является частью заданию, где требуется пронаблюдать ускорение выполнения запроса с изменением коррелированного подзапроса на объединение таблиц. Через left join у меня сразу получилось сделать, а вот с подзапросом какая-то беда. ORDER BY добавлял, когда пытался понять что за ужас происходит и найти повторяющиеся номера билетов, так он тут не требуется, да. Но я сам дойду до запроса, большое спасибо, что указали на другой ключ в таблице ticket_flights.
Ламзин Андрей
Просветленный
(37914)
4 года назад
Left join должен помочь
Select t1, t2.amount from t left join t2 on t2.id = t1.ticket_id - примерно так, вникать не могу сейчас
Борис БрянцевПрофи (624)
4 года назад
Это задание, где требуется пронаблюдать ускорение выполнения запроса, когда меняешь коррелированный подзапрос на объединение таблиц. Через left join у меня сразу получилось сделать, а вот с подзапросом какая-то беда.
Хочу вывести все номера билетов и их цену + имена людей, кто их купил
Структура таблиц tickets и ticket_flights ниже на скриншотах
Сам запрос:
SELECT
t.passenger_name,
t.ticket_no,
(SELECT tf.amount FROM ticket_flights tf
WHERE tf.ticket_no = t.ticket_no) as amount
FROM tickets t
WHERE t.passenger_name LIKE 'OLGA%'
ORDER BY 1;
Пишет, что подзапрос в выражении выдал больше одной строки, но он просто не должен так делать, ведь номер билета (ticket_no) уникальный, соответственно не повторяется, поэтому подзапрос должен был выдать только одно значение, если только подзапрос не пробегает сразу все значения вне зависимости от строки в основном запросе. То есть t.ticket_no в основном запросе это не тот же t.ticket_no, что в подзапросе, хотя я думаю, что это так, потому что если убрать номер билета из основного запроса, то выдает ошибку из-за которой в подзапрос в FROM приходится дописывать таблицу tickets к которой принадлежит t.ticket_no.
Подскажите как вообще работают подзапросы и почему в данном подзапросе может выдаваться более одной строки.