次の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
ステートメントを使用してそれらをフィルタリングします。
その結果、結果はまったく異なります。