2017-06-09 11 views
4

オラクルのCONNECT BYの仕組みを理解していると思いました。Oracle CONNECT BYの動作

しかし、私はこれを見つけました。

DUMMY CONNECT_BY_ISCYCLE 
X  0 
X  0 

しかし

select dual.*, CONNECT_BY_ISCYCLE from dual 
connect by nocycle 1=1 
and LEVEL <= 2 
and prior dummy = dummy 
; 

select dual.*, CONNECT_BY_ISCYCLE from dual 
connect by nocycle 1=1 
and LEVEL <= 2 
; 

結果は、私が最初のクエリと同じ結果を期待のみ1行

DUMMY CONNECT_BY_ISCYCLE 
X  1 

を生成します。

誰かがこれについて説明したり、説明したりできますか?

これはどのようにOracleは階層問合せで「サイクル」を識別んOracle Database 12c Release 12.1.0.1.0 - 64bit Production

答えて

3

にありますか?

文書化されていれば、それほどうまくいきません。とにかくhttps://community.oracle.com/thread/3999985

:とにかく、私たちはOTNの議論で正確かつ完全(と、本当に、非常に単純な)答えを見つけたと思うあなたは、階層クエリを実行すると、生成された行ごとに、Oracleは、列を見ていきます新しく生成された行がすでに存在する行と一致するかどうかを確認するために、connect by句のPRIOR演算子によって操作され、それらの列のみが操作されます。

これは、同じ行を100回生成したにもかかわらず、「レベル5でデュアル接続を選択してください。< = 100」が機能する理由です。 「サイクル」はCONNECT BYのPRIORより前の列のみを調べるため、サイクルはありません。

これは、connect by [other conditions here] and prior sys_guid() is not nullのようなものがよく見られる理由です。 sys_guid()は決してnullになりません。 connect byに、そして非常に重要なのはPRIOR演算子を追加することで、それぞれの呼び出しが異なる値を返すことが保証されているので、循環がないことを確認します。したがって、levelの条件で "無限再帰"または他の手段ではなく、「サイクル」の識別ではない。 (この余分な「列」がチェックされるため、Oracleにはサイクルが表示されません。)

+0

これは非常に便利なリンクです。ありがとうございます。私はそれがどこかに書かれているのだろうか(文書の欠如は、それが予告なしの変更の対象であることを示すかもしれない)。 –

関連する問題