ORA-00907: отсутствует правильная скобка, возможно, проблема с SubQuery - PullRequest
1 голос
/ 19 мая 2019

Этот запрос выдает ошибку

ORA-00907: отсутствует правая скобка

Я не могу найти проблему с круглыми скобками

   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;

Ответы [ 2 ]

4 голосов
/ 19 мая 2019

Ваша проблема заключается в следующем:

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;
1 голос
/ 19 мая 2019

Вам необходимо преобразовать подзапрос производного столбца (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 part выдает ошибку, которая должна быть заключена в дополнительный подзапрос, иначе компилятор не разрешит использовать Order By напрямую, как это. то есть ограничение (rownum=1) и использование order by не могут работать на одном уровне, они должны существовать внутри внешнего и внутреннего операторов выбора соответственно.

На самом деле лучше использовать row_number() аналитическую функцию окна, а не rownum псевдостолбец, что в большинстве случаев ненадежно, так как генерируется перед сортировкой.

Даже если вам достаточно использовать Where rownum = 1 с order by ID desc для внутреннего оператора выбора, достаточно выработать привычку, используя функцию row_number().

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