Дублирующие столбцы в запросе Oracle с использованием предложения ограничения строк

Начиная с Oracle 12c, мы можем, наконец, использовать стандартное предложение ограничения строки SQL следующим образом:

SELECT * FROM t FETCH FIRST 10 ROWS ONLY

Теперь, в Oracle 12.1, было ограничение, которое очень раздражает при подключении таблиц. Невозможно иметь два столбца с одинаковым именем в предложении SELECT при использовании предложения ограничения строки. Например, это повышает ORA-00918 в Oracle 12.1

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

Это ограничение описано в руководстве для всех версий 12.1, 12.2, 18.0:

enter image description here

Обходной путь, очевидно, относится к столбцам

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

Или прибегнуть к "классической" ROWNUM страницы, используя функции ROWNUM или окна.

Любопытно, однако, что исходный запрос с двусмысленными столбцами ID отлично подходит для Oracle 12.2. Является ли это ошибкой документации или недокументированной функцией?

Ответ 1

Я заметил, что у вас есть неявное соединение. Было бы интересно посмотреть, не исчезнет ли проблема при непосредственном присоединении. Мне интересно, если за кулисами Oracle делает соединение на основе id = id и не использует псевдонимы таблиц, которые вы им назначили.

Это также объясняет псевдонимы столбцов, фиксирующие проблему. Попробуйте явно присоединиться; что может заставить оракул использовать псевдонимы таблицы и устранить двусмысленность, которое, по его мнению, она видит.

Ответ 2

Похоже, в этом случае, когда вы используете предложение ограничения строки, Oracle внутренне вызывает ROW_NUMBER() где она использует имя столбца в предложении OVER Как ROW_NUMBER OVER(ORDER BY ID). из-за этого вы получаете ORA-00918 error.