如何在另一个查询中迭代来自一个 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)
阻止优化器使用该索引).
我是 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)
阻止优化器使用该索引).