【发布时间】:2018-05-11 12:22:05
【问题描述】:
全部,
我正在尝试创建具有两个输入的递归查询:
- ITEM_ID
- 很多
我有三个工作子查询:
- 接收中
- 批次
- 成分
我发现在简单的 SQL 中可以做到这一点,查询示例:
WITH RECURSIVE x2 (result) AS (
SELECT 1
UNION ALL
SELECT result*2 FROM x2)
SELECT * FROM x2 LIMIT 10;
当我使用 2 个输入 ITEM_ID+LOT 运行第一个子查询 RECEIVING 并返回一些行时,它的 OK 和 SQL 应该停止。 如果没有,查询应该开始在子查询 BATCH 中搜索 BATCH 编号,此批次编号用于第三个子查询 INGREDIENT 为 RECEIVING 返回 新的 ITEM_ID+LOT。
Diagram for recursive subquery
例子:
输入
- 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 点
帕特里克,
我做了这个查询,它可以工作,但速度太慢,知道如何优化它吗?
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'
;
【问题讨论】:
-
请编辑您的问题并为所涉及的表提供 DDL 以及作为 DML 和您的子查询的示例数据。
-
递归是你正在做的事情的必要条件吗?我会重新评估你想要做什么,然后问这个问题。听起来您正试图将标准 SQL 视为典型的面向对象编程语言。
-
不需要递归。我想从 RECEIVING 表中获取结果,请查看最后一张图片以了解示例。
标签: sql oracle subquery recursive-query