Oracle SQL Синтаксическая ошибка подзапроса, вызванная ORDER BY - PullRequest
0 голосов
/ 11 марта 2020

У меня синтаксическая ошибка в запросе Oracle SQL. Запрос должен получить мне отдел сотрудника. Если у сотрудника нет отдела (ноль), я хочу, чтобы отдел первого менеджера поднялся по иерархии, в которой есть отдел.

SELECT department_id FROM department
WHERE department_id =
(
    SELECT department_id FROM employee
    WHERE department_id IS NOT NULL AND rownum = 1
    start WITH employee_id = 19
    connect by employee_id = prior manager_id
    ORDER BY level
);

Сообщение об ошибке:

ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:
Error at Line: 8 Column: 2

Я написал альтернативный запрос, который делает работу. Но я не очень доволен этим.

SELECT department_id FROM department
WHERE department_id = 
(
    SELECT department_id FROM employee
    WHERE level =
    (
        SELECT MIN(level) FROM employee
        WHERE department_id IS NOT NULL
        start WITH employee_id = 19
        connect by employee_id = prior manager_id
    )
    start WITH employee_id = 19
    connect by employee_id = prior manager_id
);

У вас есть идеи, как исправить первый запрос? Или упростить второй? Заранее спасибо.

1 Ответ

0 голосов
/ 11 марта 2020

В вашем первом запросе, как правильно сказал @Barbaros, ORDER BY не нужно и даже rownum = 1 не будет делать то, что вы думаете.

Соответствует ли следующий запрос вашим требованиям:

SELECT
    E.EMPLOYEE_ID,
    CASE WHEN E.DEPARTMENT_ID IS NOT NULL 
         THEN E.DEPARTMENT_ID
         ELSE LAG(D.DEPARTMENT_ID IGNORE NULLS) OVER(ORDER BY LEVEL)
    END AS DEPARTMENT_ID
FROM
    EMPLOYEE E
    LEFT JOIN DEPARTMENT D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
START WITH E.EMPLOYEE_ID = 19
CONNECT BY E.EMPLOYEE_ID = PRIOR E.MANAGER_ID

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...