Все,
Я пытаюсь создать рекурсивный запрос, который имеет два ввода:
- ITEM_ID
- LOT
Iесть три рабочих подзапроса:
- ПОЛУЧЕНИЕ
- BATCH
- INGREDIENT
Я нашел, что это возможно сделать на простом примере SQL, напримерзапроса:
WITH RECURSIVE x2 (result) AS (
SELECT 1
UNION ALL
SELECT result*2 FROM x2)
SELECT * FROM x2 LIMIT 10;
Когда я запускаю первый подзапрос RECEIVING с 2 входами ITEM_ID + LOT , и он возвращает несколько строк, тогда его OK и SQL должны остановиться. Если нет , запрос должен начать поиск в подзапросе BATCH для Номер BATCH , этот номер пакета используется в третьем подзапросе INGREDIENT , который возвращает новый ITEM_ID + LOT для ПОЛУЧЕНИЕ .
Диаграмма для рекурсивного подзапроса
Пример:
INPUT
- ITEM_ID = 1765716
LOT = 1EP17171590
Ввести вход ITEM_ID (1765716) и LOT (1EP17171590) выполнить первый подзапрос RECEIVING => нет возвращаемых строк (если возвращает, конец SQL)
- Введите входные данные ITEM_ID (1765716) и LOT (1EP17171590) выполнить второй подзапрос BATCH =>возвращает BATCH_NO 351908
- Введите BATCH_NO (351908) выполнить третий подзапрос INGREDIENT => возвращает новые ITEM_ID (1736957) и LOT (1FP17068674) => перейти к точке 3
Пример представления
Патрик,
Я сделал этот запрос, он работает, но он слишком медленный, любая идея hблагодаря его оптимизации?
select
BATCH_ID,
BATCH_NO,
PRODUCT_ITEM_ID,
PRODUCT_ITEM
PRODUCT_LOT,
INGREDIENT_ITEM_ID,
INGREDIENT_ITEM
INGREDIENT_LOT,
LEVEL
FROM
(
SELECT
b.batch_id,
b.batch_no,
b.inventory_item_id as PRODUCT_ITEM_ID,
b.item as PRODUCT_ITEM,
b.lot as PRODUCT_LOT,
i.inventory_item_id AS INGREDIENT_ITEM_ID,
i.item as INGREDIENT_ITEM,
i.lot as INGREDIENT_LOT
FROM batch b
JOIN ingredients i
ON i.batch_id = b.batch_id
)
CONNECT BY NOCYCLE PRIOR
PRODUCT_ITEM_ID = INGREDIENT_ITEM_ID
AND PRODUCT_LOT = INGREDIENT_LOT
START WITH
PRODUCT_ITEM_ID = 1765716
AND PRODUCT_LOT = '1EP17171590'
;