Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
工单的递归SQL Oracle查询_Sql_Oracle_Subquery_Recursive Query - Fatal编程技术网

工单的递归SQL Oracle查询

工单的递归SQL Oracle查询,sql,oracle,subquery,recursive-query,Sql,Oracle,Subquery,Recursive Query,全部, 我正在尝试创建具有两个输入的递归查询: 项目编号 很多 我有三个工作子查询: 接收 批处理 配料 我发现可以在简单的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和SQ

全部,

我正在尝试创建具有两个输入的递归查询:

  • 项目编号
  • 很多
  • 我有三个工作子查询:

  • 接收
  • 批处理
  • 配料
  • 我发现可以在简单的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应该停止。如果否,查询应开始在子查询批次中搜索批次号,该批次号用于第三个子查询配料,该子查询返回新的物料ID+批次,以便接收

    例如:

    输入

  • 项目编号=1765716
  • 批次=1EP171590

  • 首先输入输入项目ID(1765716)和批次(1EP171590) 子查询接收=>无行返回(如果返回,则结束SQL)

  • 输入输入项目ID(1765716)和批次(1EP171590)运行第二个子查询 BATCH=>返回批次号351908
  • 输入批次号(351908)运行第三个子查询成分=>返回新项目ID(1736957)和批次(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'
    ;
    

    您可以这样做,而无需递归:

    ITEM_ID     LOT
    1736957     1FP17068674
    
    我使用您在屏幕截图中提供的示例数据创建了用于此目的的表:

    create table RECIEVING
    (
       ITEM_ID number,
       LOT varchar2(50)
      );
    
    insert into RECIEVING
    values(1736957,'1FP17068674');
    
    create table BATCH
    (
        BATCH number,
        ITEM_ID number,
        LOT varchar2(50)
      );
    
    insert into BATCH
    values(351908,1765716,'1EP17171590');
    
    create table INGREDIENTS
    (
      BATCH number,
      ITEM_ID number,
      LOT varchar2(50)
      );
    
    insert into INGREDIENTS
    values(351908,1736957,'1FP17068674');
    
    这是我使用的查询:

    select RECIEVING.ITEM_ID,
           RECIEVING.LOT
    from BATCH
    join INGREDIENTS
      on BATCH.BATCH = INGREDIENTS.BATCH
    join RECIEVING
      on RECIEVING.ITEM_ID = INGREDIENTS.ITEM_ID
     and RECIEVING.LOT = INGREDIENTS.LOT
    where BATCH.ITEM_ID = 1765716
      and BATCH.LOT = '1EP17171590';
    
    如果一个批次有多个成分,那么只要它存在于Receiving中,它就会返回超过1行。我不确定这是否符合你的要求

    您提供的示例的输出如下所示:

    ITEM_ID     LOT
    1736957     1FP17068674
    

    请编辑您的问题,并为所涉及的表提供DDL以及DML和子查询等示例数据。递归是您所做工作的要求吗?我会重新评估你到底想做什么,然后问这个问题。听起来您正试图将标准SQL视为一种典型的面向对象编程语言,而不需要递归。我想从接收表中得到结果,请看最后一张图片以理解示例。