Alguém pode me explicar a diferença entre as duas perguntas a seguir? Apesar de parecerem iguais, os resultados são diferentes.
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 (..)
Na segunda, o exists
predicado é movido da connect by
cláusula para a where
cláusula.
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;
Depois de ler a documentação , cheguei às seguintes conclusões.
Uma diferença entre as duas consultas é que a primeira consulta tem duas condições no
connect by
, para identificar um relacionamento - uma linha deve atender não apenas àparent_id = prior concept_id
condição, mas também àexists
cláusula.Enquanto o segundo tem apenas uma condição.
A parte da consulta que torna a distinção mais óbvia é o
start with
.Na primeira consulta, todas as linhas com
PARENT_ID = '11025'
serão retornadas e usadas comoroot
linhas. As duas condições doconnect by
serão usadas para encontrar ochildren
dessas linhas. Aexists
condição não será aplicada às linhas raiz.Por outro lado, a segunda consulta buscará as linhas
PARENT_ID = '11025'
e as filtrará com aexists
instrução.Como resultado, os resultados serão totalmente diferentes.