Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORDER BY avec requête interne, donnant à ORA-00907 la parenthèse droite manquante

Le style de codage et les crochets imbriqués inutiles rendent cela très difficile à lire et à interpréter. Mais cela aide également que, contrairement à certains commentaires, un ORA-00907 ne signifie pas toujours un nombre impair de parenthèses, il peut indiquer une erreur de syntaxe plus générale qui a provoqué le renflouement de l'analyseur. Dans ce cas, ce n'est pas très utile.

Le problème est le order by clause sur l'avant-dernière ligne, dans la sous-requête que vous comparez avec in :

...
AND RUN.RN_RUN_ID in(Select max(RUN.RN_RUN_ID) From (((((((RELEASES JOIN RELEASE_CYCLES
...
TEST.TS_TYPE = 'LR-SCENARIO')AND TEST.TS_TEST_ID =145965
ORDER BY TESTCYCL.TC_TESTCYCL_ID)
ORDER BY TESTCYCL.TC_TESTCYCL_ID,STEP.ST_STEP_ORDER

Le classement final est évidemment autorisé, mais dans cette sous-requête, il ne l'est pas. Cela devrait donc se terminer :

...
TEST.TS_TYPE = 'LR-SCENARIO')AND TEST.TS_TEST_ID =145965)
ORDER BY TESTCYCL.TC_TESTCYCL_ID,STEP.ST_STEP_ORDER

Je ne peux pas tester cela car je n'ai pas votre schéma, mais une démonstration plus simple pourrait aider à démontrer :

select d1.dummy
from dual d1
where d1.dummy in (
  select dummy
  from dual d2
  order by d2.dummy
)
order by d1.dummy;

Error at Command Line : 6 Column : 3
Error report -
SQL Error: ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"

Suppression du order by intérieur :

select d1.dummy
from dual d1
where d1.dummy in (
  select dummy
  from dual d2
)
order by d1.dummy;

DUMMY
-----
X     

Il s'attend à voir un ) au lieu de ce order by , donc l'erreur a un sens, une fois que vous savez ce qui ne va pas ; mais cela ne vous aide pas vraiment à le réduire.

Incidemment, ceci est référencé dans le document de support Oracle 731577.1 :

Obtention de ORA-00907: missing right parenthesis lors de l'utilisation d'un ORDER BY clause dans une sous-requête. Lorsque le ORDER BY la clause est supprimée, la requête s'exécute sans erreur.

...
Ceci est un comportement attendu par le bogue 4944718ORDER BY dans une sous-requête ne devrait pas fonctionner, car l'ordre des lignes est passé à la requête externe et n'a aucun impact.

Il est autorisé/ignoré dans une vue en ligne, mais pas dans une sous-requête imbriquée. (Bien qu'il puisse y avoir des exceptions où il ne génère toujours pas d'erreur...)