Столбец, неоднозначно определенный в подзапросе с использованием rownums - PullRequest
1 голос
/ 02 ноября 2011

Я должен выполнить 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-запрос перед его выполнением.По сути, мы решили звездочки, чтобы узнать, какие поля нам нужно добавить, и присвоили псевдониму каждое поле с уникальным идентификатором.Это привело к снижению производительности, но наш клиент понял, что это единственный вариант с учетом требований.

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

Ответы [ 4 ]

3 голосов
/ 02 ноября 2011

Я думаю, что вы должны указать псевдонимы для (хотя бы одного из) 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, но думаю, вы поймете идею.

2 голосов
/ 27 апреля 2012

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

выберите. *, T2.column, t2.column, t2.column (выберите t1.column, t1.column, NULL, NULL, t1.column из t1 где t1 = 'ЗНАЧЕНИЕ') левое внешнее соединение t2 на t2.column = t1.column;

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

1 голос
/ 27 апреля 2012

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

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

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

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

0 голосов
/ 09 сентября 2016

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

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
...