Могут ли иерархические запросы использоваться в условии? - PullRequest
1 голос
/ 24 февраля 2020

Я собираюсь построить иерархическое дерево в Oracle формах, используя запросы Hiearchical. Насколько я знаю, штаб-квартира работает только для одной таблицы, могут ли они использоваться в условиях, когда у нас есть сценарий основных данных.

Или он может быть основан на представлении?

Для пример; Я хочу отобразить иерархию с 3 вариантами из разных таблиц. Например, заказ клиента может иметь различные позиции. Первый список всех CO, при нажатии на указанную c CO, все элементы в нем, элемент может иметь подчасти, и так далее. Покрытие нескольких связанных таблиц

1 Ответ

1 голос
/ 24 февраля 2020

Если у вас есть тестовые данные:

CREATE TABLE customer_orders ( id, name ) AS
SELECT 1, 'Cust. Ord. XYZ' FrOM DUAL UNION ALL
SELECT 2, 'Cust. Ord. ABC' FrOM DUAL UNION ALL
SELECT 3, 'Cust. Ord. MNO' FrOM DUAL;

CREATE TABLE customer_order_items ( id, order_id, name ) AS
SELECT 1, 3, 'MNO_NNN' FROM DUAL UNION ALL
SELECT 2, 3, 'MNO_OOO' FROM DUAL UNION ALL
SELECT 3, 3, 'MNO_MMM' FROM DUAL UNION ALL
SELECT 4, 2, 'ABC_AAA' FROM DUAL;

CREATE TABLE customer_order_item_parts ( id, item_id, name ) AS
SELECT 1, 1, 'Part_2_N' FROM DUAL UNION ALL
SELECT 2, 1, 'Part_1_N' FROM DUAL UNION ALL
SELECT 3, 2, 'Part_1_O' FROM DUAL UNION ALL
SELECT 4, 2, 'Part_3_O' FROM DUAL UNION ALL
SELECT 5, 4, 'Part_5_A' FROM DUAL UNION ALL
SELECT 6, 4, 'Part_3_A' FROM DUAL UNION ALL
SELECT 7, 4, 'Part_2_A' FROM DUAL UNION ALL
SELECT 8, 4, 'Part_4_A' FROM DUAL;

Затем вы можете использовать UNION ALLJOIN s при необходимости) для объединения данных, и как только они все скомпилированы, вы можете применить иерархический запрос:

SELECT *
FROM   (
  SELECT id AS order_id,
         NULL AS item_id,
         NULL AS part_id,
         name
  FROM   customer_orders
  UNION ALL
  SELECT order_id,
         id,
         NULL,
         name
  FROM   customer_order_items
  UNION ALL
  SELECT i.order_id,
         p.item_id,
         p.id,
         p.name
  FROM   customer_order_items i
         INNER JOIN
         customer_order_item_parts p
         ON ( i.id = p.item_id )
)
START WITH item_id IS NULL
CONNECT BY NOCYCLE
      PRIOR order_id = order_id
AND   (  (   PRIOR item_id IS NULL
         AND part_id IS NULL )
      OR (   PRIOR part_id IS NULL
         AND part_id IS NOT NULL
         AND PRIOR item_id = item_id )
      )
ORDER SIBLINGS BY name

Какие выходные данные:

ORDER_ID | ITEM_ID | PART_ID | NAME          
-------: | ------: | ------: | :-------------
       2 |    <em>null</em> |    <em>null</em> | Cust. Ord. ABC
       2 |       4 |    <em>null</em> | ABC_AAA       
       2 |       4 |       7 | Part_2_A      
       2 |       4 |       6 | Part_3_A      
       2 |       4 |       8 | Part_4_A      
       2 |       4 |       5 | Part_5_A      
       3 |    <em>null</em> |    <em>null</em> | Cust. Ord. MNO
       3 |       3 |    <em>null</em> | MNO_MMM       
       3 |       1 |    <em>null</em> | MNO_NNN       
       3 |       1 |       2 | Part_1_N      
       3 |       1 |       1 | Part_2_N      
       3 |       2 |    <em>null</em> | MNO_OOO       
       3 |       2 |       3 | Part_1_O      
       3 |       2 |       4 | Part_3_O      
       1 |    <em>null</em> |    <em>null</em> | Cust. Ord. XYZ

db <> скрипка здесь

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