web-dev-qa-db-fra.com

Colonnes dupliquées dans une requête Oracle à l'aide d'une clause de limitation de ligne

Depuis Oracle 12c, nous pouvons enfin utiliser la clause de limitation de lignes standard SQL comme ceci:

SELECT * FROM t FETCH FIRST 10 ROWS ONLY

Or, dans Oracle 12.1, il existait une limitation assez gênante lors de la jonction de tables. Il n'est pas possible d'avoir deux colonnes du même nom dans la clause SELECT, lors de l'utilisation de la clause de limitation de lignes. Par exemple. cela soulève ORA-00918 dans Oracle 12.1

SELECT t.id, u.id FROM t, u FETCH FIRST 10 ROWS ONLY

Ceci est une restriction est documentée dans le manuel pour toutes les versions 12.1, 12.2, 18.0 :

 enter image description here

La solution consiste évidemment à aliaser les colonnes

SELECT t.id AS t_id, u.id AS u_id FROM t, u FETCH FIRST 10 ROWS ONLY

Ou recourir à la pagination "classique" en utilisant ROWNUM ou des fonctions de fenêtre.

Curieusement, cependant, la requête d'origine avec des colonnes ID ambiguës fonctionne parfaitement à partir d'Oracle 12.2. Est-ce un bug de la documentation ou une fonctionnalité non documentée?

17
Lukas Eder

Cela semble dans ce cas lorsque vous utilisez la clause de limitation de lignes, Oracle appelle en interne la fonction ROW_NUMBER() où elle utilise le nom de la colonne dans la clause OVER Identique à ROW_NUMBER OVER(ORDER BY ID). à cause de cela, vous obtenez le ORA-00918 error.

1
Biswanath

J'ai remarqué que vous avez une jointure implicite. Il serait intéressant de voir si le problème disparaît quand on adhère explicitement. Je me demande si en coulisse Oracle fait une jointure basée sur id = id et n'utilise pas les alias de table que vous leur avez attribués.

Cela expliquerait également les alias de colonnes qui règlent le problème. Essayez explicitement de vous joindre; cela pourrait forcer Oracle à utiliser les alias de table et à résoudre l'ambiguïté qu'il pense voir.

0
Paul Shumaker