Дублирующие столбцы в запросе 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:
Обходной путь, очевидно, относится к столбцам
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
.