Sql db2抑制递归警告
我有一个正在运行的递归sql,它可以工作,但会给我以下警告 SQL0347W递归公共表表达式DT_LAST_YEAR 包含一个无限循环。SQLSTATE=01605 我怎样才能摆脱这个警告呢Sql db2抑制递归警告,sql,db2,Sql,Db2,我有一个正在运行的递归sql,它可以工作,但会给我以下警告 SQL0347W递归公共表表达式DT_LAST_YEAR 包含一个无限循环。SQLSTATE=01605 我怎样才能摆脱这个警告呢 INSERT INTO REP_MAN_TRAN_COUNTS (SITEDIRECTORYID, BUSINESSDATE, TRANCOUNT) WITH dt_this_year (level, seqdate) AS ( SELECT 1, date(current timestamp)
INSERT INTO REP_MAN_TRAN_COUNTS (SITEDIRECTORYID, BUSINESSDATE, TRANCOUNT)
WITH dt_this_year (level, seqdate) AS
(
SELECT 1, date(current timestamp) -7 DAYS FROM sysibm.sysdummy1
UNION ALL
SELECT level, seqdate + level days FROM dt_this_year WHERE level < 1000 AND seqdate + 1 days < date(current timestamp)
)
,dt_last_year (level, seqdate) AS
(
SELECT 1, date(current timestamp) -7 DAYS - 1 year FROM sysibm.sysdummy1
UNION ALL
SELECT level, seqdate + level days FROM dt_last_year WHERE level < 1000 AND seqdate + 1 days < date(current timestamp) -1 year
)
select 10049, date(dts.calendarday), count(*) trancount
from (
SELECT seqdate AS calendarday FROM dt_this_year
UNION
SELECT seqdate AS calendarday FROM dt_last_year
) dts LEFT JOIN ccftrxheader ccf
ON date(dts.calendarday) = date(ccf.businessdate)
WHERE ccf.sitedirectoryid=10049
GROUP BY ccf.sitedirectoryid,dts.calendarday
你如何摆脱警告? 通过更改代码,使其不再首先生成警告。隐藏警告是有问题的,因为它常常掩盖潜在的更大问题。我相当肯定它在这里抱怨,因为你提供的终止条款永远无法达到,因为你从来没有操纵过它 就我个人而言,我可能会将您的查询重新写入以下内容:
INSERT INTO Rep_Man_Tran_Counts (siteDirectoryId, businessDate, tranCount)
WITH dt_Calendar_Data (level, calendarDay) AS
(SELECT l, c
FROM (VALUES (1, CURRENT_DATE - 7 DAYS),
(1, CURRENT_DATE - 7 DAYS - 1 YEAR)) t(l, c)
UNION ALL
SELECT level + 1, calendarDay + 1 DAYS
FROM dt_Calendar_Data
WHERE level < 7)
SELECT 10049, dtCal.calendarDay, COALESCE(COUNT(*), 0) as tranCount
FROM dt_Calendar_Data dtCal
LEFT JOIN ccftrxHeader ccf
ON ccf.businessDate = dtCal.calendarDay
AND ccf.siteDirectoryId = 10049
GROUP BY dtCal.seqDate
这只是一个用作表引用的标准值子句。这是构造小型临时表的SQL标准方法,而不是引用虚拟表,虚拟表往往是特定于供应商的。如果报表在2014年2月26日运行,则生成的表格将为:
t
l c
===============
1 "2014-02-19"
1 "2013-02-19"
这些列由CTE的列列表重命名,然后在联接中引用,在递归CTE的情况下,由递归部分引用。
然后形成递归查询其余部分的起始数据:
UNION ALL
SELECT level + 1, calendarDay + 1 DAYS
FROM dt_Calendar_Data
WHERE level < 7
这将一直持续到上一行的level=7,这意味着不生成新行并检查WHERE子句。通常,最好只有一个终止条件,并在每次迭代中取得进展,以便优化器更容易发现。结果数据在以下范围内:
level calendarDay
=====================
1 "2014-02-19"
. .....
7 "2014-02-26"
1 "2013-02-19"
. .....
7 "2013-02-26"
。。。作为旁注,我同时生成了今年/去年的数据,以缩短参考文献的数量。如果您只需要一年,则不需要级别。wow。。谢谢太棒了。我对你给我的东西做了一些轻微的修改,它完全按照我想要的方式工作。很抱歉打扰你,你能帮我一个忙吗?你在with条款里填了些什么。我很难理解递归是如何工作的。@Richie-类似这样的东西?
level calendarDay
======================
2 "2014-02-20"
2 "2013-02-20"
level calendarDay
=====================
1 "2014-02-19"
. .....
7 "2014-02-26"
1 "2013-02-19"
. .....
7 "2013-02-26"