我想在两个给定日期之间生成天数,所以我找到了以下使用分层查询的方法:
select CONTACT_ID, S_DATE, E_DATE, trunc(S_DATE)+level-1 dt
from CONTACTS
connect by trunc(S_DATE)+level-1<=trunc(E_DATE)
and prior dbms_random.value is not null and prior CONTACTS.CONTACT_ID = CONTACTS.CONTACT_ID;
所以,如果我有以下一行:
1, 2016-01-01 23:00:00, 2016-01-02 05:00:00
以上查询将生成以下输出:
1, 2016-01-01 23:00:00, 2016-01-02 05:00:00, 2016-01-01 00:00:00
1, 2016-01-01 23:00:00, 2016-01-02 05:00:00, 2016-01-02 00:00:00
但我不明白查询的工作原理,尤其是这一部分:and prior dbms_random.value is not null and prior CONTACTS.CONTACT_ID = CONTACTS.CONTACT_ID
有人能解释一下吗?
答案 0 :(得分:0)
您可以使用recursive subquery factoring来获得完全相同的结果,这在我看来更为直观。
with data(CONTACT_ID, S_DATE, E_DATE, DT) as (
select CONTACT_ID, S_DATE, E_DATE, S_DATE from CONTACTS
union all
select CONTACT_ID, S_DATE, E_DATE, DT+1 from data where DT+1 <= E_DATE
)
select CONTACT_ID, S_DATE, E_DATE, DT
from data
子查询中的第一个选择定义了初始条件,即从S_DATE
开始(在第4列中)。
第二个选择(重复执行)定义步骤DT + 1
,WHERE子句定义终止条件。
递归子查询因子分解是AFAIK标准,并在11.2中引入