Ora-904 ora-907 при використанні корелованих підзапитів, Oracle mechanics

Продуктивність СУБД та суміжні питання

ora-904

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 має table references (correlation names) scoped to just one level deep. Це пише віце-президент Oracle T.Kyte, відповідаючи на відповідне запитання "Іс there some sort of nesting limit for correlated subqueries?", тобто. офіційна інформація, з перших рук, приклад звідти ж. У документації Oracle, починаючи з 10.1, пишеться інакше:

Oracle виконає 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.

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

ORDER BY clause cannot appear in subqueries within інших statements.

За вищезазначеним посиланням на сайті asktom.oracle.com можна знайти приклад заміни конструкції з ORDER BY типу:

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

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