1

一部のユーザーから作成されたSQLを実行し、その結果を表示する必要があります。SQLの例は次のとおりです。

SELECT t1.*, t2.* FROM table1 t1, table2 t2, where table1.id = table2.id

このSQLはそのままで正常に動作しますが、手動でページ付けを追加して行番号を表示する必要があるため、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を解析する必要がありました。基本的に、アスタリスクを解決して、追加する必要のあるフィールドを見つけ、すべてのフィールドを一意のIDでエイリアスします。これによりパフォーマンスが低下しましたが、クライアントはそれが要件を考慮した唯一のオプションであることを理解していました。

私たちが取り組んだ解決策であるため、Lexの回答にマークを付けます。

4

4 に答える 4

3

table1.id と table2.id (少なくとも 1 つ) のエイリアスを指定する必要があると思います。また、対応する他の列名についても同様です。

したがって、代わりに次のSELECT t1.*, t2.* FROM table1 t1, table2ようなものを使用します。

SELECT t1.id t1id, t2.id t2id [rest of columns] FROM table1 t1, table2 t2

私は Oracle の構文に詳しくありませんが、理解できると思います。

于 2011-11-02T10:47:46.270 に答える
2

私は似たようなものへの答えを探していました。いくつかのNULL列を持つエイリアスサブクエリを参照していました。複数の列があるため、NULL列のエイリアスを作成する必要がありました。

a。*、t2.column、t2.column、t2.columnを選択します(t1からt1.column、t1.column、NULL、NULL、t1.columnを選択します。ここでt1 ='VALUE')t2の左外側結合t2。 column = t1.column;

サブクエリでNULL列のエイリアスを作成すると、正常に機能しました。

于 2012-04-26T22:17:44.673 に答える
1

クエリを構文的に変更して(またはユーザーにそうしてもらう) 、句で明示的なJOIN構文を使用できる場合、これにより、目前の問題が自動的に修正されます。USING

SELECT t1.*, t2.*
FROM   table1 t1
JOIN   table2 t2 USING (id)

このUSING句は、結果に1つの列だけが残ることを除いて、(または質問にON t1.id = t2.id暗黙的に含まれている)と同じように機能します。これにより、問題が解消されます。JOINid

USING句に含まれていない同じ名前の列がさらにある場合は、依然として問題が発生します。その場合、@Lexで記述されているエイリアスが不可欠です。

于 2012-04-26T22:35:48.607 に答える