web-dev-qa-db-ja.com

WHEREの条件とCONNECT BYの条件

次の2つのクエリの違いを誰かに説明できますか?同じように見えても結果は異なります。

select concept.concept_id, concept.PARENT_ID 
from ebti_thes_concept_v concept
  start with PARENT_ID = '11025'
  connect by parent_id = prior concept_id
  and exists (..) 

2番目のものでは、exists述語がconnect by句からwhere句に移動されています。

select concept.concept_id, concept.PARENT_ID
from ebti_thes_concept_v concept
where exists (..)
 start with PARENT_ID = '11025'
 connect by parent_id = prior concept_id;

documentation を読んだ後、次の結論に達しました。

2つのクエリの1つの違いは、最初のクエリは、関係を識別するためにconnect byに2つの条件があることです。行は、parent_id = prior concept_id条件だけでなくexists句も満たす必要があります。

 connect by parent_id = prior concept_id
 and exists (..)

一方、2番目の条件には1つの条件しかありません。

 connect by parent_id = prior concept_id;

クエリを区別しやすくする部分はstart withです。

最初のクエリでは、PARENT_ID = '11025'を含むすべての行が返され、root行として使用されます。 connect byの2つの条件は、これらの行のchildrenを見つけるために使用されます。 exists条件は、ルート行には適用されません。

一方、2番目のクエリは、PARENT_ID = '11025'を使用して行をフェッチし、existsステートメントを使用してそれらをフィルタリングします。

その結果、結果はまったく異なります。