Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 db2抑制递归警告_Sql_Db2 - Fatal编程技术网

Sql db2抑制递归警告

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)

我有一个正在运行的递归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) -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"