Этот запрос дает ошибку
ORA-00907: Missing right parenthesis
Я не могу найти проблему со скобками
select
(select PRE_DESIG_ID FROM AUTHORIZATION
WHERE PROJECT_ID = 5 and PRE_DESIG_ID =48 and
ROWNUM=1 order by ID DESC) AS PERPARED_BY
,(Select PRE_LAST_DATE From (Select PRE_LAST_DATE From AUTHORIZATION
Where PROJECT_ID = 5 and PRE_DESIG_ID = 48 Order By ID Desc)
Where ROWNUM = 1) AS PRE_END_DT from AUTHORIZATION au
LEFT join PROJECT p on AU.PROJECT_ID =p.PROJECT_ID
LEFT join DESIGNATION d on au.AU_DESIG_ID=d.DESIGID;
Вам необходимо преобразовать подзапрос производного столбца (prepared_by
), аналогичный подзапросу pre_end_dt
, как показано ниже.
Select
(Select pre_desig_id
From (Select pre_desig_id,
row_number() over (order by ID desc) as rn
From Authorization
Where project_id = 5
and pre_desig_id = 48
)
Where rn = 1) as prepared_by,
(Select pre_last_date
From (Select pre_last_date,
row_number() over (order by ID desc) as rn
From Authorization
Where project_id = 5
and pre_desig_id = 48
)
Where rn = 1) as pre_end_dt
From Authorization au
Left Join Project p
on au.project_id = p.project_id
Left Join Designation d
on au.au_desig_id = d.desigid;
где Order By ID Desc
часть выдает ошибку, которая должна быть заключена в дополнительный подзапрос, иначе компилятор не позволяет использовать Order By
напрямую как это. то есть ограничение (rownum=1
) и использование order by
не могут работать на одном уровне, они должны существовать во внешнем и внутреннем операторах выбора соответственно.
На самом деле, лучше использовать row_number()
оконную аналитическую функцию, а не rownum
псевдостолбец, которому в большинстве случаев нельзя доверять, поскольку он генерируется перед сортировкой.
Даже если вам достаточно использовать Where rownum = 1
с order by ID desc
для внутреннего оператора выбора, скорее сделайте привычкой использовать функцию row_number()
.
Ваша проблема заключается в следующем:
ORDER BY id DESC
Вы не можете использовать ORDER BY
в подзапросе, который действует как выражение столбца. Если вы удалите его, ошибка, с которой вы столкнулись, исчезнет.
Но я бы предпочел, чтобы вы переписали свой запрос, используя предложение with
, поскольку оба выражения вашего подзапроса выбирают одну и ту же строку.
WITH auth AS ( SELECT *
FROM ( SELECT pre_desig_id AS perpared_by,
pre_last_date AS pre_end_dt
FROM authorization
WHERE project_id = 5
AND pre_desig_id = 48 ORDER BY id DESC )
WHERE ROWNUM = 1 )
SELECT a.perpared_by,a.pre_end_dt
FROM authorization au
LEFT JOIN project p ON au.project_id = p.project_id
LEFT JOIN designation d ON au.au_desig_id = d.desigid
CROSS JOIN auth a;
А для тех, кто использует 12.1 или более позднюю версию,
fetch first row only
устраняет многие из этих сложностей.