Oracle PL/SQL通过记录“返回”循环
我有个问题,希望你能帮我解决 我有一个名为PRODUCT的表:Oracle PL/SQL通过记录“返回”循环,oracle,plsql,oracle10g,hierarchical-data,oracleforms,Oracle,Plsql,Oracle10g,Hierarchical Data,Oracleforms,我有个问题,希望你能帮我解决 我有一个名为PRODUCT的表: Product_ID NOT NULL NUMBER(10) TARGET_PRODUCT VARCHAR2(10) SOURCE_PRODUCT VARCHAR2(10) 因此,每个由源产品生成的目标产品(第一个除外)只有目标产品,而源产品为空 我需要找到给定目标产品的第一个源产品。 我需要在循环中“返
Product_ID NOT NULL NUMBER(10)
TARGET_PRODUCT VARCHAR2(10)
SOURCE_PRODUCT VARCHAR2(10)
因此,每个由源产品生成的目标产品(第一个除外)只有目标产品,而源产品为空
我需要找到给定目标产品的第一个源产品。
我需要在循环中“返回”,直到源产品为空。
这种情况有解决方案吗
提前感谢这不是您需要的循环,而是分层查询。看看下面基于Scott的EMP表的示例
这是它的内容,;员工按层级显示,显示谁是谁的上司:
SQL> select level,
2 lpad(' ', level * 2, ' ') || e.ename name
3 from emp e
4 start with e.mgr is null
5 connect by prior e.empno= e.mgr;
LEVEL NAME
---------- ---------------
1 KING
2 JONES
3 SCOTT
4 ADAMS
3 FORD
4 SMITH
2 BLAKE
3 ALLEN
3 WARD
3 MARTIN
3 TURNER
3 JAMES
2 CLARK
3 MILLER
14 rows selected.
SQL>
当您想从桌子中间开始时,例如,从史密斯开始,您可以将其反转:
SQL> select level lvl,
2 lpad(' ', level * 2, ' ') || e.ename name
3 from emp e
4 start with e.ename = 'SMITH'
5 connect by prior e.mgr= e.empno;
LVL NAME
---------- ---------------
1 SMITH
2 FORD
3 JONES
4 KING
SQL>
最后,将该查询用作CTE或子查询,如果您的表单版本不支持CTE,请获取名称级别最高的查询:
SQL> with temp as
2 (select level lvl,
3 lpad(' ', level * 2, ' ') || e.ename name
4 from emp e
5 start with e.ename = 'SMITH'
6 connect by prior e.mgr= e.empno
7 )
8 select trim(t.name) name
9 from temp t
10 where t.lvl = (select max(t1.lvl) from temp t1);
NAME
---------------
KING
SQL>
或者,更好的方法是使用connect_by_isleaf:
您可以尝试此操作,它将返回给定目标产品的基本目标产品:
select * from (
select PRODUCT_ID, TARGET_PRODUCT, SOURCE_PRODUCT
from PRODUCT
start with target_product = '<your target product>'
connect by prior SOURCE_PRODUCT = TARGET_PRODUCT
)
where SOURCE_PRODUCT is null;
请分享示例数据,并通过所需输出解释问题,以便以具体方式回答您的问题。
select * from (
select PRODUCT_ID, TARGET_PRODUCT, SOURCE_PRODUCT
from PRODUCT
start with target_product = '<your target product>'
connect by prior SOURCE_PRODUCT = TARGET_PRODUCT
)
where SOURCE_PRODUCT is null;