У меня есть таблица Oracle SQL (10g) с данными, относящимися к ведомости материалов. Например, один элемент имеет список сырья, и этот список может содержать элемент с его собственной спецификацией материалов, и в этом списке может быть элемент, который может иметь свою собственную спецификацию материалов.

Мне нужно перечислить спецификацию материалов с соответствующими элементами, и если есть какие-либо подпункты, то этот список элементов, и если у этих элементов есть какой-либо список, то этот список и т. Д. И т. Д. ... Мы не знаем уровень дерева предметов, он случайный.

Я сейчас не могу опубликовать изображение, объясню следующее:

Пункт A ------ Сырье 1
Пункт A ------ Сырье 2
Элемент A ------ полуфабрикат Элемент 1 - сырье 3
Элемент A ------ полуфабрикат Элемент 1 - сырье 4
Элемент A ------ полуфабрикат 1 - полуфабрикат 2 - сырье 5
Элемент A ------ Полуобработанный элемент 1 - полуфабрикат 2 - полуфабрикат 3 - Сырье 6
и т. д. и т. д ....

Новый пример:

ITEMCODE BOMCODE QTY
ABCD XYZ 1
ABCD2 XYZ 8
ABCD3 XYZ 3
ABCD4 XYZ 56
ABCD76 ABCD3 1
ABCD98 ABCD3 5
ABCD34 ABCD4 2
ABCD21 ABCD4 8
ABCD90 ABCD98 9
ABCD31 ABCD98 2

В таблице 3 поля: код товара, код товара, кол-во.

Этот пример предназначен для элемента 'xyz', для создания элемента 'xyz' нам нужны элементы, перечисленные в коде элемента с указанным количеством, и, если вы посмотрите, есть некоторые элементы, такие как 'abcd3', 'abcd4', которые имеют свою собственную ведомость материал, такой же для abcd98. Я не знаю уровней, так как это случайное количество уровней.

0
user3625561 27 Авг 2014 в 11:41
Ваше требование неясно. Не могли бы вы показать нам, какой запрос вы пробовали? Кроме того, если вы не можете опубликовать изображение, загрузите его на хостинг изображений и, если возможно, предоставьте ссылку.
 – 
CodeNewbie
27 Авг 2014 в 11:45
Разработайте для этой задачи иерархический запрос.
 – 
PrR3
27 Авг 2014 в 11:46
На это нельзя ответить ИМО. Если вы не знаете уровень дерева, как бы мы? и как мы можем предложить запрос без имен таблиц и имен полей? Нам также потребуются некоторые образцы данных для проверки любого предлагаемого запроса.
 – 
Paul Maxwell
27 Авг 2014 в 11:47
Я не могу прямо ответить на ваш вопрос, но вам действительно следует использовать Google. Найдите примеры использования функции SYS_CONNECT_BY_PATH.
 – 
ibre5041
27 Авг 2014 в 11:51
- добавили пример в вопросе выше. Благодарность
 – 
user3625561
27 Авг 2014 в 12:16

2 ответа

Лучший ответ

Как объяснил @Used_By_Already, следующий запрос является ответом на мой вопрос:

SELECT
  LEVEL, BOMCODE, ITEMCODE, QTY
FROM
  BOMS
WHERE
  LEVEL <= 30
  START WITH BOMCODE      = 'XYZ'
  CONNECT BY PRIOR ITEMCODE = BOMCODE
ORDER BY
  LEVEL, BOMCODE, ITEMCODE, QTY
;
0
user3625561 27 Авг 2014 в 14:16
1
Вы должны просто прокомментировать его сообщение и, прежде всего, принять его ответ!
 – 
Emmanuel
27 Авг 2014 в 14:59
Это НЕ должно быть отмечено как ответ, да ладно, я понимаю, что вы сделали. Ваше здоровье.
 – 
Paul Maxwell
12 Фев 2015 в 05:19

Такой результат:

| LEVEL | BOMCODE | ITEMCODE | QTY |
|-------|---------|----------|-----|
|     1 |     XYZ |     ABCD |   1 |
|     1 |     XYZ |    ABCD2 |   8 |
|     1 |     XYZ |    ABCD3 |   3 |
|     1 |     XYZ |    ABCD4 |  56 |
|     2 |   ABCD3 |   ABCD76 |   1 |
|     2 |   ABCD3 |   ABCD98 |   5 |
|     2 |   ABCD4 |   ABCD21 |   8 |
|     2 |   ABCD4 |   ABCD34 |   2 |
|     3 |  ABCD98 |   ABCD31 |   2 |
|     3 |  ABCD98 |   ABCD90 |   9 |

Производится по этому запросу:

SELECT
  LEVEL, BOMCODE, ITEMCODE, QTY
FROM
  BOMS
WHERE
  LEVEL <= 30
  START WITH BOMCODE      = 'XYZ'
  CONNECT BY PRIOR ITEMCODE = BOMCODE
ORDER BY
  LEVEL, BOMCODE, ITEMCODE, QTY
;

Я использовал имя таблицы BOMS, и количество уровней, используемых в предложении where, произвольно, это действительно "безопасность" количества рекурсий.

См. эту демонстрацию SQLfiddle

Не уверен, что вы этого хотели. Может быть следующее:

PATH
------------------------------
XYZ/ABCD
XYZ/ABCD2
XYZ/ABCD3
XYZ/ABCD4
XYZ/ABCD3/ABCD76
XYZ/ABCD3/ABCD98
XYZ/ABCD4/ABCD21
XYZ/ABCD4/ABCD34
XYZ/ABCD3/ABCD98/ABCD31
XYZ/ABCD3/ABCD98/ABCD90

От:

SELECT
   LPAD(' ', 2*level-1)||'XYZ'||SYS_CONNECT_BY_PATH(ITEMCODE, '/') "Path"
FROM
  BOMS
WHERE
  LEVEL <= 30
  START WITH BOMCODE      = 'XYZ'
  CONNECT BY PRIOR ITEMCODE = BOMCODE
ORDER BY
  LEVEL, BOMCODE, ITEMCODE, QTY
;
0
Paul Maxwell 27 Авг 2014 в 13:33
Добавил пример в вопросе выше. Благодарность
 – 
user3625561
27 Авг 2014 в 12:17
Большое спасибо, я получил результат, который я хотел с вашим первым запросом. Еще раз спасибо.
 – 
user3625561
27 Авг 2014 в 14:15
Нет проблем, тогда ты будешь accepting the answer? Это указывает на то, что вопрос завершен, и является важной частью процесса вопросов/ответов.
 – 
Paul Maxwell
27 Авг 2014 в 16:03