如何解决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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。