ORA-00907: Отсутствует правая скобка, возможно, проблема с подзапросом

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

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;
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам необходимо преобразовать подзапрос производного столбца (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 устраняет многие из этих сложностей.

William Robertson 19.05.2019 20:21

Другие вопросы по теме