SQL Oracle-如何查找同一表的最终值?

问题描述

所以我有一个看起来像这样的表:

['xystack','xsytack','xstyack','xstayck','xstacyk','xstacky','sxytack','sxtyack','sxtayck','sxtacyk','sxtacky','stxyack','stxayck','stxacyk','stxacky','staxyck','staxcyk','staxcky','stacxyk','stacxky','stackxy']

所以里克->布兰登-> TJ->乔纳森

所以我的输出应该是:

+---------+-------------+-----------+
|  Name   | Name_Change |  Status   |
+---------+-------------+-----------+
| Rick    | Brandon     | Cancelled |
| Brenda  | Alexa       | Active    |
| Brandon | TJ          | Cancelled |
| TJ      | Jonathan    | Active    |
| Randy   |             | Active    |
+---------+-------------+-----------+

如何在sql上编写代码

TIA

解决方法

您可以使用递归CTE,如下所示:

with
n (name,name_change,status,version) as (
  select t.*,1 from t where name = 'Rick'
 union all
  select n.name,t.name_change,t.status,n.version + 1
  from n
  join t on t.name = n.name_change
)
select *
from n
where version = (select max(version) from n);

请参见SQL Fiddle上的运行示例。

,

这是分层查询的典型示例,该示例以成员Name = 'Rick'开头。通过使用CONNECT_BY_ISLEAF伪列作为WHERE CONNECT_BY_ISLEAF = 1来过滤记录,以使记录具有最高(例如 destest leaf )元素。顺便说一句,可以通过使用Rick函数在起始member(SYS_CONNECT_BY_PATH())之后得出整个路径,并根据从该函数返回的最短层次路径得出Name。因此,使用

WITH t AS
(
 SELECT MAX(Name) KEEP ( DENSE_RANK FIRST 
                         ORDER BY LENGTH(SYS_CONNECT_BY_PATH(Name_Change,' ->')) )
                         OVER () AS "Name",SYS_CONNECT_BY_PATH(Name_Change,' ->') AS "Hierarchy Path",Name_Change AS "Final Name",Status AS "Status",CONNECT_BY_ISLEAF AS cbi
   FROM tab t
  START WITH Name = 'Rick'
CONNECT BY PRIOR Name_Change = Name
)
SELECT "Name","Hierarchy Path","Final Name","Status"
  FROM t
 WHERE cbi = 1;

Demo