Меню Закрыть

Ora 00907 missing right parenthesis ошибка

Содержание

Базы данных

ORA-00907: упущены правые скобки

Причина:

Были введены левые скобки без закрытия правыми скобками или в скобках была заключена дополнительная информация. Все скобки должны вводится парами.

Действие:

Убедитесь, что вы имеете парное множество скобок, затем выполните выражение снова.

27.08.2009

ora-904 ora-907 при использовании коррелированных подзапросов

При использовании коррелированных подзапросов, т.е. подзапросов, результаты которых используются для каждой строки основного запроса — «a correlated subquery is evaluated once for each row», могут встречаются ошибки, неточно объясняющие, что делается неправильно

ora-904 «%s: invalid identifier»

ora-907 «missing right parenthesis»

Первая ошибка ora-904 в случае correlated subquery при отсутствии синтаксических ошибок сообщает об использовании более, чем одного уровня глубины вложенности (N-th level sub-query):

что не поддерживается Oracle (до версии 11.1.0.7 включительно) и стандартом SQL: ANSI SQL has table references (correlation names) scoped to just one level deep. Это пишет вице-президент Oracle T.Kyte, отвечая на соответствующий вопрос «Is there some sort of nesting limit for correlated subqueries?», т.е. информация официальная, из первых рук, пример оттуда же. В документации Oracle, начиная с 10.1, пишется иначе:

Oracle performs a correlated subquery when a nested subquery references a column from a table referred to a parent statement any number of levels above the subquery

— но, это, видимо, долгосрочные планы Oracle.

ora-907

тут проблема старая и известная: запрет на использование ORDER BY в подзапросах, описанная в документации Oracle 7 (в документации следующих версий уже не упоминается — видимо, тоже есть планы по исправлению):

The ORDER BY clause cannot appear in subqueries within other statements.

По вышеупомянутой ссылке на сайте asktom.oracle.com можно найти пример замены конструкции с ORDER BY типа:

Читайте также:  Ценность карт на арене в hearthstone

на аналитическую функцию типа :

для одновременного понижения уровня вложенности подзапроса (correlated query level deep) до 1 и устранения проблемы с ORDER BY в подзапросе — конструкция dense_rank first ORDER BY допускается Oracle.

Необходимо выбрать список значений Item_ID с самой поздней (максимальной) датой, но при выполнении выдаётся ошибка ORA-00907: missing right parenthesis. Если переводить дословно, то она указывает на несоответствие количества скобок. Подскажите, что может быть не так?

Сам фрагмент выбора максимальной даты работает:

1 ответ 1

В Oracle подзапросах не может быть фразы order by , т.к. она там не имеет никакого смысла. В итоге Oracle ожидает увидеть правую скобку сразу после фразы group by , однако натыкается на слово order и на нем сообщает, что не нашел скобку.

Кроме этого после исправления у вас возникнет вторая ошибка: подзапрос вернет более одной строки, что недопустимо в случае использования оператора = , следует использовать IN .

Правда этот запрос вероятно сделает не то, что вы хотели. Вы задаете group by Item_ID и берете таким образом для каждого Item_ID максимальную дату. Но для любого Item_ID найдется максимальная дата, в итоге вы получите полный список Item_ID из вашей таблицы. Поэтому, если вам нужны Item_ID с одинаковой, но самой большой в таблице датой — то следует убрать group by , либо заменить его на какой то, более отвечающий вашей задаче.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.