複数 - sql 重複削除 条件




行制限句を使用してOracleクエリの重複列 (2)

ROW_NUMBER OVER(ORDER BY ID)のようにOVER句で列名を使用するROW_NUMBER()関数を内部的に呼び出している行制限句を使用している場合です。 このため、ORA-00918エラーが発生しています。

Oracle 12c以来、私たちはついにこのようなSQL標準行制限節を使用することができます:

SELECT * FROM t FETCH FIRST 10 ROWS ONLY

Oracle 12.1では、テーブルを結合する際に非常に面倒な制限がありました。 行制限条項を使用する場合、 SELECT句に同じ名前の2つの列を持つことはできません。 たとえば、Oracle 12.1でORA-00918が発生しました

SELECT t.id, u.id FROM t, u FETCH FIRST 10 ROWS ONLY

これは、すべてのバージョン12.1,12.2,18.0のマニュアルに記載されている制限事項です。

回避策は明らかに列のエイリアスです

SELECT t.id AS t_id, u.id AS u_id FROM t, u FETCH FIRST 10 ROWS ONLY

または、 ROWNUMまたはウィンドウ関数を使用して "古典的な"ページ設定に頼ることもできます。

興味深いことに、あいまいなID列を持つ元のクエリは、Oracle 12.2以降で正常に動作します。 これはドキュメントのバグか、文書化されていない機能ですか?


暗黙の参加があることに気付きました。 明示的に結合するときに問題が解消するかどうかを確認することは面白いでしょう。 私は舞台裏でOracleがid = idに基づいて結合を行っていて、それらを割り当てたテーブルの別名を使用していないのだろうかと思います。

それはまた、問題を解決するコラムエイリアスを説明するでしょう。 明示的に参加してください。 oracleにテーブルのエイリアスを使用させ、それが見ていると思うあいまいさを解消する可能性があります。







pagination