Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Подзапрос в выражении выдает больше одной строки

Борис Брянцев Профи (624), закрыт 4 года назад
Помогите разобраться с postgersql

Хочу вывести все номера билетов и их цену + имена людей, кто их купил

Структура таблиц 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.

Подскажите как вообще работают подзапросы и почему в данном подзапросе может выдаваться более одной строки.
Лучший ответ
Андрей Высший разум (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 у меня сразу получилось сделать, а вот с подзапросом какая-то беда.
Jurijus Zaksas Искусственный Интеллект (467156) 4 года назад
Запусти запрос - найдешь гавриков, которые купили один и тот же билет несколько раз:

select ticket_no, count(*)
from ticket_flights
group by ticket_no
having count(*)>1
Похожие вопросы