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




pagination (2)

Начиная с 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 или оконные функции.

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


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


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

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







pagination