gpt4 book ai didi

database - Oracle - 执行递归 'WITH' 查询时检测到循环

转载 作者:搜寻专家 更新时间:2023-10-30 23:25:52 31 4
gpt4 key购买 nike

我正在使用 oracle sql 做一个递归查询的基本示例。我正在计算格式 MON-YY 的 future 月份。我设法得到了一个看似正确的查询,但我不明白 WITH 查询的中断条件。

我试图打破年份值(例如,当您到达 2020 年时停止),但它在这样做时检测到一个周期。如果我打破月份值(例如 12 月),它会起作用。

这是我基于一个月的休息时间的查询:

with
prochains_mois(mois, annee) as (
select 'sep' as mois, 19 as annee
from dual
union all
select
case mois
when 'jan' then 'fev'
when 'fev' then 'mar'
when 'mar' then 'avr'
when 'avr' then 'mai'
when 'mai' then 'jun'
when 'jun' then 'jui'
when 'jui' then 'aou'
when 'aou' then 'sep'
when 'sep' then 'oct'
when 'oct' then 'nov'
when 'nov' then 'dec'
when 'dec' then 'jan'
end,
case mois
when 'dec' then annee + 1
else annee
end
from prochains_mois r
where mois <> 'dec'
)
select * from prochains_mois;

如果我这样做,它会返回一致的结果。

MOI      ANNEE
--- ----------
sep 19
oct 19
nov 19
dec 19

现在,如果我尝试打破年份的递归查询,假设是 2020 年,那么我将 with 子句中的 where 条件更改为:

where annee < 20

然后我得到:

ORA-32044: cycle detected while executing recursive WITH query

我试图打破一个后来的月份,看看我的年份加法是否正确,似乎是这样。如果我在 3 月中断,我会正确地得到 1 月和 2 月:

where mois <> 'mar'

给予

MOI      ANNEE
--- ----------
sep 19
oct 19
nov 19
dec 19
jan 20
fev 20
mar 20

最佳答案

使用 DATE:

with prochains_mois( value ) as (
select DATE '2019-09-01' from dual
union all
select ADD_MONTHS( value, 1 )
FROM prochains_mois
WHERE value < DATE '2020-12-01'
)
select SUBSTR( TO_CHAR( value, 'mon', 'NLS_DATE_LANGUAGE=FRENCH' ), 1, 3 ) AS mois,
TO_CHAR( value, 'RR' ) AS annee
from prochains_mois;

输出:

MOIS | ANNEE:--- | :----sep  | 19   oct  | 19   nov  | 19   dec  | 19   jan  | 20   fev  | 20   mar  | 20   avr  | 20   mai  | 20   jui  | 20   jui  | 20   aou  | 20   sep  | 20   oct  | 20   nov  | 20   dec  | 20   

或使用您的查询并检查月份年份是否不匹配:

with
prochains_mois(mois, annee) as (
select 'sep' as mois, 19 as annee
from dual
union all
select
case mois
when 'jan' then 'fev'
when 'fev' then 'mar'
when 'mar' then 'avr'
when 'avr' then 'mai'
when 'mai' then 'jun'
when 'jun' then 'jui'
when 'jui' then 'aou'
when 'aou' then 'sep'
when 'sep' then 'oct'
when 'oct' then 'nov'
when 'nov' then 'dec'
when 'dec' then 'jan'
end,
case mois
when 'dec' then annee + 1
else annee
end
from prochains_mois r
where ( mois, annee ) NOT IN ( ( 'dec', 20 ) )
)
select * from prochains_mois;

输出:

MOIS | ANNEE:--- | ----:sep  |    19oct  |    19nov  |    19dec  |    19jan  |    20fev  |    20mar  |    20avr  |    20mai  |    20jun  |    20jui  |    20aou  |    20sep  |    20oct  |    20nov  |    20dec  |    20

db<> fiddle here

关于database - Oracle - 执行递归 'WITH' 查询时检测到循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58025343/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com