У меня есть таблица «Пользователи» и таблица «Задачи». Задачи упорядочены по важности и назначаются в список задач пользователя. Задачи имеют статус: готовы или не готовы. Теперь я хочу перечислить всех пользователей с их самой важной задачей, которая также готова.
Интересное требование о том, что задачи для каждого пользователя сначала нужно отфильтровать и отсортировать, а потом выбрать самую важную. Вот что я придумал:
SELECT Users.name,
(SELECT *
FROM (SELECT Tasks.description
FROM Tasks
WHERE Tasks.taskListCode = Users.taskListCode AND Tasks.isReady
ORDER BY Tasks.importance DESC)
WHERE rownum = 1
) AS nextTask
FROM Users
Однако это приводит к ошибке
ORA-00904: "Users"."taskListCode": invalid identifier
Я думаю, причина в том, что oracle не поддерживает корреляцию подзапросов с более чем одним уровнем глубины. Однако мне нужно два уровня, чтобы я мог выполнить WHERE rownum = 1
.
Я также попробовал это без коррелирующего подзапроса:
SELECT Users.name, Task.description
FROM Users
LEFT JOIN Tasks nextTask ON
nextTask.taskListCode = Users.taskListCode AND
nextTask.importance = MAX(
SELECT tasks.importance
FROM tasks
WHERE tasks.isReady
GROUP BY tasks.id
)
Это приводит к ошибке
ORA-00934: group function is not allowed here
Как бы я решил проблему?
WHERE task.isready
? В базе данных Oracle нет логических значений. - person mathguy   schedule 22.12.2016