仅针对更新的记录获取层次结构

时间:2015-08-05 11:20:39

标签: 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
----------
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

我需要一个选择查询,它将获取在'01 -Aug-2015'之后或之后更新的所有记录。另外,我需要获取在'01 -Aug-2015'

上更新的任何父级子资源的详细信息

所以在我的情况下,我需要从2015年8月1日更新的资源表中获取所有记录。就我而言,它只是R15。 此外,它还应该从Resource_Tree表中获取详细信息,其中任何更新发生在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 

2 个答案:

答案 0 :(得分:0)

这可能不是一个优雅的解决方案;

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

答案 1 :(得分:0)

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

您在rid之后的01年8月1日之后选择cte,然后在ResourceTree表上加入其他表格。