SQL

Выполнение вложенного запроса в БД. Скалярные запросы.

Все привет!
Помогите , пожалуйста, написать корректный запрос на задание

Выведите количество полётов каждого пассажира, представленного в таблице Passenger. Список полётов находится в таблице Pass_in_trip.
В качестве результата выведите количество полётов (используйте псевдоним count) и имя пассажира.

Мой запрос корректен. Но в задаче спецом сделан подвох. Есть еще Bruce Willis но с другим id из таблицы Passenger. И конечно, при группировке он вылетает. И я должен использовать технику вложенного запроса select внутри select, но я не знаю как. Уже второй день парюсь
Azat Djunushaliev
Azat Djunushaliev
429
>И я должен использовать технику вложенного запроса select внутри select, но я не знаю как
Не должен. Просто сделай этот запрос, а группировку сделай по имени, примерно так:

SEELCT P.NAME, COUNT(*)
FROM PASS_IN_TRIP T
INNER JOIN PASSENGER P ON T.PASSENGER=P.ID
GROUP BY P.NAME

>И конечно, при группировке он вылетает.
Ничего тут никуда не "вылетает". Сказано группировать по имени - значит, идентификатор в данном запросе это имя.
Mr. Babayev
Mr. Babayev
79 037
Лучший ответ
Azat Djunushaliev У вас тут какая то синтаксическая ошибка да? Что за T после FROM PASS_IN_TRIP T
Azat Djunushaliev Дело в том что нужно группировать не только тех кто полетел, но и тех кто не летел. То бишь у кого значение null
Azat Djunushaliev Увы я не понимаю такого запроса да и СУБД не поймет. Нет в системе никакого T.PASSENGER например
Azat Djunushaliev Написал рабочий запрос
SELECT Name, COUNT(Pass_in_trip.passenger) as count
FROM Passenger
LEFT JOIN Pass_in_Trip ON passenger = Passenger.id
GROUP BY Passenger.id

Да он работает, НО в задании хотят select внутри select. И это тоже бы хотелось понимать
Как ты до соединений дошел, если со скалярными подзапросами проблемы?

select
p.name name,
(select count(pt.id) from pass_in_trip pt where pt.passenger = p.id) count
from passenger p

В твоем же варианте нужно группировать по id, а не по name, потому как "Плюс Уиллис" (два полных тезки). И да, группировать можно по полю не из выборки.

select name, count(passenger) count
from passenger
left join pass_in_trip on passenger.id = pass_in_trip.passenger
group by passenger.id
Виталий Дунаев
Виталий Дунаев
18 091
Вложенный запрос будет делаться согласно задаче, как понимаю это c SQL academy
SELECT name,
(select count (id) from Pass_in_trip where passenger=Passenger.id ) as count
FROM Passenger;
Решила данную задачу двумя способами (оба прошли)

1) Через объединение двух таблиц и группировку по id пассажиров (по именам не работает, ибо там два тёски Брюса Уилисса)

SELECT COUNT(trip) AS count , name
FROM Passenger
LEFT JOIN Pass_in_trip
ON Passenger.id = Pass_in_trip.passenger
GROUP BY Passenger.id

2) Через вложенный скалярный подзапрос, связанный с внешним в условии (согласно заданию)

SELECT (
SELECT COUNT(trip)
FROM Pass_in_trip
WHERE passenger = Passenger.id
) AS count , name
FROM Passenger