У меня есть таблица 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. Я не знаю уровней, так как это случайное количество уровней.
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
;
Такой результат:
| 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
;
accepting the answer
? Это указывает на то, что вопрос завершен, и является важной частью процесса вопросов/ответов.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.
SYS_CONNECT_BY_PATH
.