Столбец, неоднозначно определенный в подзапросе с использованием 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