Ora-904 ora-907 при използване на корелирани подзаявки, Oracle механика

Производителност на СУБД и свързани проблеми

използване

ora-904 ora-907 при използване на корелирани подзаявки

Когато използвате корелирани подзаявки, т.е. подзаявки, чиито резултати се използват за всеки ред от основната заявка - "корелирана подзаявка се оценява веднъж за всеки ред", може да има грешки, които не обясняват точно какво е направено погрешно

ora-904 "%s: невалиден идентификатор"

ora-907 "липсваща дясна скоба"

Първата грешка ora-904 в случай на корелирана подзаявка при липса на синтактични грешки отчита използването на повече от едно ниво на дълбочина на влагане (подзаявка на N-то ниво):

който не се поддържа от Oracle (до и включително версия 11.1.0.7) и стандарта SQL: ANSI SQL има препратки към таблици (имена на корелация) с обхват само на едно ниво. Това е написано от вицепрезидента на Oracle T.Kyte, отговаряйки на свързания въпрос „Има ли някакво ограничение за влагане за корелирани подзаявки?“ официална информация, от първа ръка, пример от същото място. Документацията на Oracle от 10.1 казва различно:

Oracle изпълнява корелирана подзаявка, когато вложена подзаявка препраща към колона от таблица, препращаща към родителско изявление произволен брой нива над подзаявката

- но, очевидно, това са дългосрочните планове на Oracle.

тук проблемът е стар и добре познат: забраната за използване на ORDER BY в подзаявки, описана в документацията на Oracle 7 (вече не се споменава в документацията на следващите версии - очевидно има и планове за коригиране):

Клаузата ORDER BY не може да се показва в подзаявки в други изрази.

На горната връзка на сайта asktom.oracle.com можете да намерите пример за замяна на конструкция с тип ORDER BY:

за аналитичентип функция:

за едновременно понижаване на нивото на влагане на подзаявката (дълбоко корелирано ниво на заявка) до 1 и премахване на проблема с ORDER BY в подзаявката, конструкцията dense_rank първа ORDER BY е разрешена от Oracle.