Разработчик MySQL здесь - Вложение с select * finicky в Oracle 10g?

0

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

Теги:
oracle10g
ora-00918

2 ответа

1
Лучший ответ

Когда 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
    Интересно, что имеет смысл. Разве оракул не должен отвергать первое утверждение, если оно отвергнет второе? «Вы действительно пытаетесь отфильтровать NULL? Если так, зачем вообще использовать внешнее соединение?» Нет. Я украл этот запрос у кого-то другого, и это утверждение И действительно совершенно случайно - я не уверен, почему они его туда поместили, и, конечно, они имели в виду <> '' - но тот факт, что я не мог просто обернуть вещь «Выбор *» вызвал у меня вспыльчивость, потому что казалось, что это нарушает некоторые основополагающие принципы, если выбор * сработает вообще. Ваше объяснение имеет смысл, спасибо. ;)
0

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

  • 0
    Как я уже говорил в первом предложении, это простой диагностический запрос, который я собираюсь запустить в блокноте для своих собственных целей. Это просто замечательно, и я должен быть в состоянии сделать это - я никогда не помещаю select * s в реальный код, но я буду писать их весь день, когда они идут на мой локальный жесткий диск, и я использую их для личного просмотра таблиц. и отладить вещи.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню