Разработчик MySQL здесь - Вложение с select * finicky в Oracle 10g? - PullRequest
0 голосов
/ 14 мая 2010

Я пишу простой диагностический запрос, а затем пытаюсь выполнить его в Oracle 10g SQL Scratchpad. РЕДАКТИРОВАТЬ: он не будет использоваться в коде. Я вкладываю простое «Выбрать *», и оно дает мне ошибки.

В SQL Scratchpad для Oracle 10g Enterprise Manager Console этот оператор работает нормально.

SELECT *  FROM v$session sess, v$sql     sql  WHERE sql.sql_id(+) = sess.sql_id and sql.sql_text <> ' ' 

Если я пытаюсь обернуть это в Select * from () tb2, я получаю ошибку «ORA-00918: Столбец определен неоднозначно». Я не думал, что такое могло произойти с таким заявлением, поэтому я немного растерялся.

 select * from
 (SELECT *  FROM v$session sess, v$sql     sql  WHERE sql.sql_id(+) = sess.sql_id and sql.sql_text <> ' ')
 tb2

Вы всегда должны иметь возможность выбирать * из результирующего набора другого оператора select *, используя эту структуру, насколько я знаю ... верно?

Oracle / 10g / блокнот пытается заставить меня принять определенную синтаксическую структуру, чтобы предотвратить чрезмерное вложение? Это ошибка в блокноте или что-то о том, как работает Oracle?

Ответы [ 2 ]

1 голос
/ 14 мая 2010

Когда Oracle анализирует SELECT *, он расширяет его до фактического списка столбцов, которые нужно выбрать. Поскольку встроенное представление содержит два столбца с именем SQL_ID, это приводит к неоднозначной ссылке.

Интересно, что использование синтаксиса соединения ANSI, похоже, приводит к автоматическому псевдониму дубликатов имен столбцов и, следовательно, позволяет избежать ошибки.

select * from
(select * from v$session sess left outer join v$sql sql on sql.sql_id=sess.sql_id and sql.sql_text <> ' ')

Кстати, мне не ясно, почему вы выбрали это условие на sql_text. Я не ожидаю, что этот столбец будет содержать один пробел. Вы действительно пытаетесь отфильтровать NULL? Если да, зачем вообще использовать внешнее соединение?

0 голосов
/ 14 мая 2010

Одно из главных правил моего места работы заключается в том, что SELECT * никогда не допускается. Явно определите, какие столбцы вам нужны; он не только более читабелен, но и менее вероятен в будущем

...