PL/SQL 循环"返回"记录



我有一个问题,希望你能帮忙解决。

我有一个名为PRODUCT:的表

Product_ID               NOT NULL NUMBER(10)       
TARGET_PRODUCT                    VARCHAR2(10)  
SOURCE_PRODUCT                    VARCHAR2(10)  

因此,由source_product组成的每个target_product(除了第一个——第一个只有target_productsource_productnull(我需要为给定的target_product找到第一个source_product。我需要在循环中返回,直到源产品为null。这种情况有解决方案吗?

提前感谢

您需要的不是循环,而是层次查询。请根据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>

如果您想从表的中间开始(例如,从SMITH开始(,您可以"反转"它:

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(或者子查询,如果您的Forms版本不支持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:

SQL> select e.ename name
2  from emp e
3  where connect_by_isleaf = 1
4  start with e.ename = 'SMITH'
5  connect by prior e.mgr= e.empno;
NAME
---------------
KING
SQL>

您可以尝试一下,它将返回给定target_product:的基本target_product

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;

最新更新