Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 仅获取更新记录的层次结构_Sql_Oracle_Select - Fatal编程技术网

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