Oracle PL/SQL通过记录“返回”循环

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的表:

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;