Sql 如何在oracle中通过continue from和to id列连接多行
我有一个场景,我需要从Oracle中由continued_from和continued_to date字段绑定的多行中查找开始日期和结束日期。 结果应该是这样的Sql 如何在oracle中通过continue from和to id列连接多行,sql,oracle,hierarchical-data,Sql,Oracle,Hierarchical Data,我有一个场景,我需要从Oracle中由continued_from和continued_to date字段绑定的多行中查找开始日期和结束日期。 结果应该是这样的 ID STARTDATE ENDDATE -- ---------- ---------- 3 01/01/1000 12/31/9999 ID STARTDATE ENDDATE CONT_FROM_ID CONT_TO_ID -- ---------- ----------
ID STARTDATE ENDDATE
-- ---------- ----------
3 01/01/1000 12/31/9999
ID STARTDATE ENDDATE CONT_FROM_ID CONT_TO_ID
-- ---------- ---------- ------------ -----------
1 01/01/1000 10/10/1999 NULL 2
2 10/10/1999 11/11/2000 1 3
3 11/11/2000 12/31/9999 2 NULL
Oracle的分层查询语法使得从父级到子级遍历树变得很容易。分析
lead()
和lag()
函数跟踪下一个和上一个ID
select c23.id
, c23.startdate
, c23.enddate
, lag(c23.id) over (partition by p23.id order by c23.id) as cont_from_id
, lead(c23.id) over (partition by p23.id order by c23.id) as cont_to_id
from p23
join c23 on p23.startdate <= c23.startdate
and p23.enddate >= c23.enddate
order by c23.id
/
选择c23.id
,c23.startdate
,c23.enddate
,滞后(c23.id)超过(按p23.id划分,按c23.id排序)作为cont_from_id
,将(c23.id)引导到(按p23.id划分,按c23.id排序)上,作为cont_to_id
从第23页开始
在p23.startdate=c23.enddate上加入c23
按c23.id订购
/
以下是使用您的样本数据进行的测试:
SQL> select c23.id
2 , c23.startdate
3 , c23.enddate
4 , lag(c23.id) over (partition by p23.id order by c23.id) as cont_from_id
5 , lead(c23.id) over (partition by p23.id order by c23.id) as cont_to_id
6 from p23
7 join c23 on p23.startdate <= c23.startdate
8 and p23.enddate >= c23.enddate
9 order by c23.id
10 /
ID STARTDATE ENDDATE CONT_FROM_ID CONT_TO_ID
---------- --------- --------- ------------ ----------
1 01-JAN-00 10-OCT-99 2
2 10-OCT-99 11-NOV-00 1 3
3 11-NOV-00 31-DEC-99 2
SQL>
SQL>选择c23.id
2,c23.startdate
3,c23.enddate
4,滞后(c23.id)超过(按p23.id划分,按c23.id排序)作为cont_from_id
5,将(c23.id)作为cont_-to_-id引入(按p23.id划分,按c23.id排序)
第23页第6页
7在p23.startdate=c23.enddate上加入c23
9通过c23.id订购
10 /
ID STARTDATE ENDDATE CONT_从\u ID CONT_到\u ID
---------- --------- --------- ------------ ----------
1 01-JAN-00 1999年10月10日2
2 1999年10月10日11月11日1 3
2000年11月3日1999年12月31日2
SQL>
您是否检查了递归查询的文档?使用“连接方式”是解决此问题的一种方法。