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

How to Iterate over data from one Oracle Query in another Query.

我是 PL/SQL 和 Oracle SQL 查询领域的新手。

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

逻辑:
1. 获取最后 100 个标签为“600”的所有箱子。此外,统计过去 100 天内运送的标签为“600”的数量。 (例如,今天是 09/06,获取 05/29 发货的所有箱子) 2. 获取所有具有更新标签的盒子的数量。例如,在 06/01,其中一个框从“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)。

能否请您建议我需要对 运行 此代码段进行哪些更改?

在子查询中使用纯 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 ) 

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