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

Plsql 如何在另一个查询中迭代来自一个Oracle查询的数据。,plsql,oracle11g,oracle-sqldeveloper,oracle12c,Plsql,Oracle11g,Oracle Sqldeveloper,Oracle12c,我不熟悉PL/SQL和Oracle SQL查询的世界 我想要达到的目标是什么? 获取从今天起最后100天(sysdate-100)装运的所有标有“600”标签的箱子。在这些盒子中,我需要将更新标签为“50”和“51”的盒子分开 逻辑: 1.让所有的箱子在最后100日装运,标签为“600”。另外,获取过去100天内装运的标签为“600”的数量。(例如,今天是09/06,获取05/29发货的所有箱子) 2.获取具有更新标签的所有框的计数。E. G,在从“600”->“50”移动的盒子中,有06个/

我不熟悉PL/SQL和Oracle SQL查询的世界

我想要达到的目标是什么?
获取从今天起最后100天(sysdate-100)装运的所有标有“600”标签的箱子。在这些盒子中,我需要将更新标签为“50”和“51”的盒子分开

逻辑:
1.让所有的箱子在最后100日装运,标签为“600”。另外,获取过去100天内装运的标签为“600”的数量。(例如,今天是09/06,获取05/29发货的所有箱子) 2.获取具有更新标签的所有框的计数。E. G,在从“600”->“50”移动的盒子中,有06个/ 01个,我需要考虑这个盒子。 我正试图为这个用例编写一个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中引发了一个错误。我在Oracle11g和Oracle12c上运行这个。 只要解决方案适用于Oracle,我就可以灵活地使用任何方法(不一定是PL/SQL)


您能建议我运行此代码段所需的更改吗

将普通SQL与子查询一起使用,而不是PL/SQL循环:

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 ) 
和装箱日期>=trunc(SYSDATE-100)
装箱日期

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

因此:您有两个表,
装箱日期
发货信息
box\u id
在一个表中是唯一的(可能是主键),在另一个表中是外键?什么是“更新的”标签-仅指可在
装运信息
表中找到的任何标签(针对该
箱子id
)?这是所有你应该在你的帖子中提供的信息-除了代码,就像你做的一样。谢谢!我想你简化了我的问题陈述。。我想这应该行得通