PL / SQl вопрос, оракул 9i - PullRequest
       4

PL / SQl вопрос, оракул 9i

0 голосов
/ 19 июля 2011

Хорошо, ребята, у нас есть ситуация в нашем проекте. У нас есть заказ, который разместил клиент, и он разбивается на несколько заказов. Нам нужно выяснить, на сколько заказов он распался.

Структура таблицы выглядит так:

Order_Orig       Order_next  Sr #
1                     2        1
2                     3        2
3                     4        3

Так, как и в примере выше, у нас есть заказ 1, который был размещен у клиента, и он был разбит на 1,2,3,4 заказа и сохранен в таблице в указанном формате. Так как же нам узнать, на сколько заказов был разбит первоначальный заказ?

ТИА

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Как говорит Давидср, вам нужно использовать иерархический запрос.

Если вы хотите просто узнать, на сколько заказов был разбит конкретный заказ, вы можете использовать:

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.

Надеюсь, это поможет ....

1 голос
/ 20 июля 2011

Может быть, это может направить вас в правильном направлении с помощью иерархических запросов.

Вот несколько подробных примеров!

Иерархические запросы

...