Столбец, неоднозначно определенный в подзапросе с использованием rownums

Я должен выполнить SQL, сделанный некоторыми пользователями, и показать его результаты. Пример SQL может быть таким:

SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id

Этот SQL работает нормально, как есть, но мне нужно вручную добавить нумерацию страниц и показать rownum, поэтому SQL заканчивается так.

SELECT z.* 
FROM(       
    SELECT y.*, ROWNUM rn
    FROM (                   
        SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id
    ) y      
    WHERE ROWNUM <= 50) z         
WHERE rn > 0

Это вызывает исключение: "ORA-00918: столбец определен неоднозначно", поскольку и Table1, и Table2 содержат поле с одинаковым именем ("id").

Что может быть лучшим способом избежать этого?

С уважением.

  • ОБНОВИТЬ

В конце концов, нам пришлось пойти по безобразному пути и проанализировать каждый SQL-запрос перед его выполнением. По сути, мы решили звездочки, чтобы узнать, какие поля нам нужно добавить, и присвоили псевдониму каждое поле с уникальным идентификатором. Это привело к снижению производительности, но наш клиент понял, что это единственный вариант с учетом требований.

Я отмечу ответ Лекса, так как это решение, над которым мы в конечном итоге работали.

4 ответа

Решение

Я думаю, что вы должны указать псевдонимы для (хотя бы одного из) table1.id и table2.id. И, возможно, для любых других соответствующих имен столбцов.

Так что вместо SELECT t1.*, t2.* FROM table1 t1, table2 использовать что-то вроде:

SELECT t1.id t1id, t2.id t2id [rest of columns] FROM table1 t1, table2 t2

Я не знаком с синтаксисом Oracle, но думаю, вы поймете эту идею.

Я искал ответ на что-то подобное. Я ссылался на подзапрос с псевдонимом, который имел пару столбцов NULL. Мне пришлось создать псевдоним столбцы NULL, потому что у меня их было больше одного;

выберите a.*, t2.column, t2.column, t2.column (выберите t1.column, t1.column, NULL, NULL, t1.column из t1, где t1='VALUE') левое внешнее соединение t2 в t2. колонка =t1.column;

Как только я связал пустые столбцы в подзапросе, все заработало нормально.

Если бы вы могли изменить запрос синтаксически (или заставить пользователей сделать это), чтобы использовать явный JOIN синтаксис с USING предложение, это автоматически решит проблему под рукой:

SELECT t1.*, t2.*
FROM   table1 t1
JOIN   table2 t2 USING (id)

USING пункт делает так же, как ON t1.id = t2.id (или неявный JOIN у вас есть в вопросе), кроме того, что только один id столбец остается в результате, тем самым устраняя вашу проблему.

Вы все равно столкнетесь с проблемами, если будет больше столбцов с одинаковыми именами, которые не включены в USING пункт. Псевдонимы, описанные @Lex, тогда необходимы.

Используйте функцию замены пустых значений, чтобы исправить это.

SELECT z.* 
FROM(       
    SELECT y.*, ROWNUM rn
    FROM (                   
        SELECT t1.*, t2.* FROM table1 t1, table2 t2, where 

        NVL(table1.id,0) = NVL(table2.id,0)

    ) y      
    WHERE ROWNUM <= 50) z         
WHERE rn > 0
Другие вопросы по тегам