Вы не понимаете, как работает CONNECT BY
.Вот пошаговое руководство о том, как Oracle оценивает ваш второй запрос.
Без предложения START WITH
каждая строка в вашей таблице будет использоваться в качестве отправной точки или «корня» в вашей иерархии.
Поскольку у вас нет условий CONNECT BY
(например, "columnA = PRIOR columnB"), каждая строка в вашей таблице будет считаться дочерней по отношению к любой другой строке.Это будет происходить вечно, пока ваше LEVEL <=4
состояние не будет достигнуто.
Итак,
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 строк.Начиная с 4 рядов с уровня 2, оба SNO 1 и SNO 2 являются дочерними для каждого, давая 4x2 = 8 строк на уровне 3.
Уровень 4, который я не буду вытягивать, аналогично даст 8x2= 16 строк.
Таким образом, в общей сложности у вас есть 2 + 4 + 8 + 16 = 30 строк.(Это уровень 1 + уровень 2 + уровень 3 + уровень 4).
Затем, после вашей обработки CONNECT BY
(показанной выше), применяется условие WHERE
, ограничивающееконечные результаты в строках, где значение (на самом низком уровне иерархии) равно SNO = 1
.Это ровно половина из 30 строк или 15 строк, что вы и получаете.