你不明白如何CONNECT BY
作品。以下是 Oracle 如何评估第二个查询的演练。
没有START WITH
子句,表中的每一行都可以用作层次结构中的起点或“根”。
既然你没有CONNECT BY
条件(例如“columnA = PRIOR columnB”),表中的每一行都将被视为每隔一行的子行。这将永远发生,直到你LEVEL <=4
条件达到。
So,
LEVEL 1
--------
SNO 1
SNO 2
说明:表中的每一行都是其自身层次结构的起点(因为您没有START WITH
状况)。
LEVEL 2
--------
SNO 1 -> SNO 1
SNO 1 -> SNO 2
SNO 2 -> SNO 1
SNO 2 -> SNO 2
这 4 行的解释 - SNO 1 和 SNO 2 都是根,对于每个根,SNO 1 和 SNO 2 都是子根。因此,2x2 行 = 4 行。
LEVEL 3
-------
SNO 1 -> SNO 1 -> SNO 1
SNO 1 -> SNO 1 -> SNO 2
SNO 1 -> SNO 2 -> SNO 1
SNO 1 -> SNO 2 -> SNO 2
SNO 2 -> SNO 1 -> SNO 1
SNO 2 -> SNO 1 -> SNO 2
SNO 2 -> SNO 2 -> SNO 1
SNO 2 -> SNO 2 -> SNO 2
这 8 行的解释。从第 2 级的 4 行开始,SNO 1 和 SNO 2 都是各自的子级,因此第 3 级有 4x2 = 8 行。
第 4 级(我不会画出来)同样会给出 8x2 = 16 行。
因此,总共有 2 + 4 + 8 + 16 = 30 行。 (即1级+2级+3级+4级)。
Then, after your CONNECT BY
处理(如上所示),WHERE
应用子句,将最终结果限制为值(位于层次结构的最低级别)为的行SNO = 1
。这正是您所得到的 30 行或 15 行的一半。