代码之家  ›  专栏  ›  技术社区  ›  underwood

如何在另一个查询中迭代来自一个Oracle查询的数据。

  •  0
  • underwood  · 技术社区  · 7 年前

    我不熟悉PL/SQL和Oracle SQL查询。


    获取从今天(sysdate-100)起最后100天发货的所有标签为“600”的箱子。在这些盒子中,我需要将更新标签为“50”和“51”的盒子分开。

    逻辑:
    2.获取具有更新标签的所有箱子的计数。E、 G,在01年6月,其中一个箱子从“600”->“50”,我需要考虑这个盒子。

    我正试图为这个用例编写一个PL/SQL,到目前为止我已经做到了这一点。

        VARIABLE box_id CHAR(50);
    
        BEGIN
           FOR box_id IN (SELECT
           box_id, box_lable
           FROM
           my.box_table
           WHERE box_lable = '600'
           AND trunc(boxed_date) = trunc(SYSDATE - 100)
           ) LOOP
    
           select count(*), box_lable
           from my.shipping_info si
           where  box_id = si.box_id
           and box_lable in ( '51', '50')
           group by box_lable
    
    --COde to print the  count of box_label = 600; count of box_label = 51; count of box_label = 50 .  
    
      END LOOP;
    END;
    

    上面的代码在SQL Developer中引发了一个错误。我在Oracle 11g和Oracle 12c上运行这个。 只要解决方案适用于Oracle,我就可以灵活地使用任何方法(不一定是PL/SQL)。

    您能建议我运行这个代码段需要做哪些更改吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   krokodilko    7 年前

    select box_lable, count(*)
    from my.shipping_info si
    where  box_id IN (
           SELECT box_id
           FROM my.box_table
           WHERE box_lable = '600'
           AND trunc(boxed_date) = trunc(SYSDATE - 100)
      )
      and box_lable in ( '51', '50')
    group by box_lable
    

    还应考虑重写此条件:

    AND trunc(boxed_date) = trunc(SYSDATE - 100)
    


    AND boxed_date >= trunc(SYSDATE - 100) 
    AND boxed_date < trunc(SYSDATE - 99 ) 
    

    这可能看起来很冗长,但有助于优化选择更好的执行计划,特别是允许在上使用索引 boxed_date 如果存在(函数 trunc(boxed_date) 防止optiomizer使用该索引)。