Sql 仅获取更新记录的层次结构
我有两个表和一些资源数据Sql 仅获取更新记录的层次结构,sql,oracle,select,Sql,Oracle,Select,我有两个表和一些资源数据 Resource ---------- rID | rname | updatedstamp R1 Res1 01-Jul-2015 R2 Res2 01-Jul-2015 R3 Res3 01-Jul-2015 R4 Res4 01-Jul-2015 R5 Res5 01-Jul-2015 R15 Res15 01-Aug-2015 ResourceTree ------
Resource
----------
rID | rname | updatedstamp
R1 Res1 01-Jul-2015
R2 Res2 01-Jul-2015
R3 Res3 01-Jul-2015
R4 Res4 01-Jul-2015
R5 Res5 01-Jul-2015
R15 Res15 01-Aug-2015
ResourceTree
----------
parID | rID | updatedStamp
---------------------------
NULL R1 01-Jul-2015
R1 R2 01-Aug-2015
R2 R3 01-Jul-2015
R3 R4 01-Jul-2015
R4 R5 01-Jul-2015
R14 R15 01-Jul-2015
我需要一个select查询,该查询将获取“2015年8月1日”当天或之后更新的所有记录。此外,我需要获取在“2015年8月1日”更新的任何家长的子资源的详细信息
所以在我的例子中,我需要从2015年8月1日更新的资源表中获取所有记录。在我的情况下,只有R15。
此外,它还应从2015年8月1日当天或之后发生任何更新的资源树表中获取详细信息。在我的情况下,它将是R2 R3 R4 R5
结果
parid rid rname
R14 R15 Res15
R1 R2 Res2
R2 R3 Res3
R3 R4 Res4
R4 R5 Res5
到目前为止,我一直在努力
SELECT RT.ParID,R.ID,R.Rname
FROM RESOURCES R, RESOURCETREE RT
WHERE R.RID = RT.RID
And (R.UpdatedStamp >= '01-Aug-2015' or RT.UpdatedStamp >= '01-Aug-2015')
START WITH RT.ParID ='R1' AND
CONNECT BY PRIOR RT.RID=RT.ParID
这可能不是一个优雅的解决方案
with temp_tbl_1 as (
-- get all the "rid" updatedstamp >= '01-Aug-2015' from both tables
select rID
from ResourceTree
where updatedstamp >= '01-Aug-2015'
union all
select rid
from Resource
where updatedstamp >= '01-Aug-2015'
),
temp_tbl_2 as (
select parID, rID
from ResourceTree
START WITH rID in (select distinct rID from temp_tbl_1)
CONNECT BY PRIOR RID = ParID
)
select t.parID, t.rID, r.rname
from temp_tbl_2 t
join Resource r
on r.rID = t.rID
您在
cte
中选择rid
后于2015年8月1日,然后左键连接ResourceTree表上的其他表。我认为应该是connectbyprevior RT.ParID=RT.rid
这是错误的。如果我在资源树中有一个条目“R16”、“R17”、“01-Jul-2015”,则您的代码将中断
with x as (
select rid from ResourceTree
where updatedstamp >= '01-Aug-2015'
union
select rid from Resourc
where updatedstamp >= '01-Aug-2015'
)
select r.parid, r.rid, re.rname
from ResourceTree r
left join x on r.parid = x.rid
left join Resourc re on re.rid = r.rid
where r.parid is not null