Я пишу простой диагностический запрос, а затем пытаюсь выполнить его в Oracle 10g SQL Scratchpad. EDIT: он не будет использоваться в коде. Я вложен простой "Select *", и это дает мне ошибки.
В SQL Scratchpad для Oracle 10g Enterprise Manager консоль эта инструкция работает нормально.
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 анализирует 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? Если да, зачем вообще использовать внешнее соединение?
Один из общих правил в моем рабочем месте - это то, что SELECT * никогда не разрешается. Четко определите, какие столбцы вам нужны; это не только более читаемо, но и менее вероятно, что проблемы будут идти по дороге