Как говорит Давидср, вам нужно использовать иерархический запрос.
Если вы хотите просто узнать, на сколько заказов был разбит конкретный заказ, вы можете использовать:
SELECT MAX(level) + 1 AS sub_order_number
FROM <order_table>
START WITH order_orig = <orig_order_id>
CONNECT BY PRIOR order_next = order_orig;
Используя данные таблицы, которые вы указали, и используя 1, вы получите sub_order_number, равный 4, а orig_order_id, равный 1, будет разделен на 4 порядка.
Если вы хотите увидеть эти заказы, вы можете использовать:
SELECT order_orig,
order_next,
level
FROM <order_table>
START WITH order_orig = <orig_order_id>
CONNECT BY PRIOR order_next = order_orig;
Используя те же критерии, что и выше, вы получите:
ORDER_ORIG ORDER_NEXT LEVEL
1 2 1
2 3 2
3 4 3
Если вы измените значение на 2, вы получите:
ORDER_ORIG ORDER_NEXT LEVEL
2 3 1
3 4 2
Вы можете проверить это сами, я запустил все это одним запросом, используя:
WITH t AS (SELECT 1 AS order_orig,
2 AS order_next,
1 AS Sr# FROM DUAL
UNION
SELECT 2 AS order_orig,
3 AS order_next,
2 AS Sr# FROM DUAL
UNION
SELECT 3 AS order_orig,
4 AS order_next,
3 AS Sr# FROM DUAL
)
SELECT order_orig,
order_next,
level
FROM t
START WITH order_orig = 2
CONNECT BY PRIOR order_next = order_orig;
Для получения дополнительной информации об иерархических запросах см. Ссылку в ответе davidsr.
Надеюсь, это поможет ....