Oracle / SQL - 一个递归查询而不是多个“union all”?

时间:2013-08-12 14:45:37

标签: sql oracle union recursive-query

我有一个现有的查询,它将我的数据库60天前的成员库(sysdate-60)返回到一行,如下所示:

date -  - - - members
sysdate-60   200.000

我想在一个查询中合并这个查询的多个查询的结果,以获得这样的结果:

date - - - -  members
sysdate-60   200.000
sysdate-59   210.000
sysdate-58   220.000

我可以通过手动编辑每个查询的日期并使用“UNION ALL”来完成,但这很烦人。我正在寻找更好的解决方案。

我偶然发现了“递归查询”并认为这可以解决我的问题,但我无法根据自己的需要对其进行自定义。你能吗?

期待你的答案。

编辑:

让我们假设这是我使用的查询,并且没有其他方法可以检索成员数量:<

SELECT sysdate-60 AS date, count(*) AS members FROM members WHERE start_date<sysdate-60 AND end_date>=sysdate-60

2 个答案:

答案 0 :(得分:1)

您可以使用以下查询生成1到60之间的数字:

select level  from dual connect by level <= 60;

然后将其加入现有查询,例如

select  'sysdate('|| d|| ')' 
      , sum( case round(sysdate - created) when d then 1 else 0 end)
  from 
        user_objects
      , ( select level d from dual connect by level <= 60)
group by d      
order by 1
;

 SELECT sysdate - d, count(*) 
 FROM members 
   , ( select level d from dual connect by level <= 60) 
 WHERE start_date<sysdate-d 
   AND end_date>=sysdate-d 
 group by d
; 

答案 1 :(得分:0)

你不需要递归;你只需要一个柜台。

此查询将为您提供过去60天的列表,以当前日期结束:

SELECT TRUNC(SYSDATE) - LEVEL + 1 AS TheDate
FROM DUAL
CONNECT BY LEVEL <= 60

如果列表应以昨天的日期结束,只需从示例中删除+ 1

然后,您可以将其加入主查询中,您就可以摆脱所有UNION次查询。