WHERE 中的条件与 CONNECT BY 中的条件

gia*_*kis 5 oracle hierarchy where

谁能向我解释以下两个查询之间的区别?尽管它们看起来相同,但结果却不同。

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 (..) 
Run Code Online (Sandbox Code Playgroud)

在第二个中,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;
Run Code Online (Sandbox Code Playgroud)

gia*_*kis 5

阅读文档后,我得出以下结论。

两个查询之间的一个区别在于,第一个查询在 中具有两个条件,connect by以识别关系 - 行不仅必须满足parent_id = prior concept_id条件,还必须满足exists子句。

 connect by parent_id = prior concept_id
 and exists (..)
Run Code Online (Sandbox Code Playgroud)

而第二个只有一个条件。

 connect by parent_id = prior concept_id;
Run Code Online (Sandbox Code Playgroud)

使区别更加明显的查询部分是start with.

在第一个查询中,PARENT_ID = '11025'将返回所有行并用作root行。的两个条件connect by将用于查找children这些行的 。该exists条件不会应用于根行。

另一方面,第二个查询将PARENT_ID = '11025'使用exists语句获取行并过滤它们。

结果,结果将完全不同。

  • 是的。第一个查询说*“找到我 X 的孩子,然后是他们所有的蓝色后代”*,而第二个说 *“找到我 X 的 **蓝色** 孩子,然后是他们所有的蓝色后代”*(其中“蓝色”在子查询中检查的属性中)。 (2认同)