Проблема в том, что подзапрос не имеет псевдонима (как упоминалось в других ответах). Я хочу отметить, что вам не нужен подзапрос вообще. Вы можете написать запрос как:
SELECT d.Dname as driver,
floor(months_between(sysdate, d.driver.DDOB) / 12) as age,
d.Dgrade as position,
avg(b.TripRating) as rating
FROM driver d LEFT JOIN
booking b
ON b.driverID = d.bookingID AND
b.tDate >= DATE '2019-04-01' AND
b.tDate < DATE '2019-05-01'
GROUP BY d.Dname,
floor(months_between(sysdate, d.DDOB) / 12),
d.Dgrade
ORDER BY rating;
Некоторые примечания по запросу, однако вы пишете:
- Псевдонимы таблиц облегчают написание и чтение запроса. Это должны быть сокращения для имен таблиц.
- Oracle поддерживает ключевое слово
DATE
для введения констант даты в стандартном формате YYYY-MM-DD.
- Обратите внимание, что я изменил логику даты, чтобы использовать
>=
и <
вместо BETWEEN
. Это особенно важно в Oracle, где тип данных DATE
имеет компонент времени, поэтому ваша логика может пропустить Tdates
на '2019-04-30'
, если они имеют компонент времени.
- При
LEFT JOIN
условия фильтрации должны быть в предложении ON
(ваша версия, в которой они находятся в подзапросе, также работает).