0

簡単な診断クエリを作成し、それを Oracle 10g SQL Scratchpad で実行しようとしています。編集:コードでは使用されません。単純な「Select *」をネストしていますが、エラーが発生しています。

Oracle 10g Enterprise Manager コンソールの SQL Scratchpad では、このステートメントは正常に実行されます。

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/the Scratchpad は、過剰なネストを防ぐために特定の構文構造を受け入れるよう強制しようとしていますか? これはスクラッチパッドのバグですか、それともオラクルの仕組みに関するものですか?

4

2 に答える 2

1

Oracle は を解析するときSELECT *に、選択する列の実際のリストに展開します。インライン ビューには という名前の 2 つの列が含まれて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 を除外しようとしていますか? もしそうなら、なぜ外部結合を使用するのでしょうか?

于 2010-05-14T16:57:43.807 に答える
0

私の職場での一般的な経験則の 1 つは、SELECT * は決して許可されないということです。必要な列を明示的に定義します。読みやすくなるだけでなく、将来的に問題が発生する可能性が低くなります

于 2010-05-14T15:30:49.453 に答える