2017-08-15 48 views
0

我正在使用CTE创建一个递归查询来将多个列数据合并为一个。DB2使用CTE和sql递归获取QDT数组列表的最大值超过

我有大约9个正在运行的CTE(我需要按照每个请求在一行中合并几次列,所以我有CTE助手)。当我添加第10个时,我得到一个错误。我正在对Visual Studio 2010中的查询,这里是错误:

enter image description here

而使用,WRKOBJLCK MyUserProfile * USRPRF命令AS400系统上,我看到:

enter image description here

我找不到任何关于此的信息。

我使用DB2的AS400系统上运行,并使用:操作系统:i5/OS的版本:V5R4M0

我重复上述3 CTE的,但有不同的条件来比较:

t1A (ROWNUM, PARTNO, LOCNAM, LOCCODE, QTY) AS 
    ( 
    SELECT rownumber() over(partition by s2.LOCPART), s2.LOCPART, s2.LOCNAM, s2.LOCCODE, s2.LOCQTY 
    FROM (
      SELECT distinct s1.LOCPART, L.LOCNAM, L.LOCCODE, L.LOCQTY 
      FROM(
        SELECT COUNT(LOCPART) AS counts, LOCPART 
        FROM LOCATIONS 
       WHERE LOCCODE = 'A' 
       GROUP BY LOCPART) S1, LOCATIONS L 
        WHERE S1.COUNTS > 1 AND S1.LOCPART = L.LOCPART AND L.LOCCODE = 'A' 
       )s2 
), 
    t2A(PARTNO, LIST, QTY, CODE, CNT) AS 
    (
     select PARTNO, LOCNAM, QTY, LOCCODE, 1 
     from t1A 
     where ROWNUM = 1 
     UNION ALL 
     select t2A.PARTNO, t2A.LIST || ', ' || t1A.LOCNAM, t1A.QTY, t1A.LOCCODE, t2A.CNT + 1 
     FROM t2A, t1A 
     where t2A.PARTNO = t1A.PARTNO 
     AND t2A.CNT + 1 = t1A.ROWNUM 
), 
    t3A(PARTNO, LIST, QTY, CODE, CNT) AS 
    (
     select t2.PARTNO, t2.LIST, q.SQTY, t2.CODE, t2.CNT 
     from(
       select SUM(QTY) as SQTY, PARTNO 
       FROM t1A 
       GROUP BY PARTNO 
      ) q, t2A t2 
     where t2.PARTNO = q.PARTNO 
) 

使用这些,我只是简单地选择一个CTE进行测试,每当我有超过9个CTE(即使只有一个被调用)时,我都会得到错误。

在AS400错误(绿屏快照)中,QDT代表什么,何时在这里使用Array?

+0

QDT =查询定义模板。我相信它与查询计划相似。 –

+0

啊好吧谢谢。对我来说,这听起来像是说sql语句太长的复杂方式,但我认为它会更具体。也许CTE被存储在一个数组中? – eaglei22

+0

我知道我之前打过嵌套表限制,也许这就是发生了什么。我不认为SQL语句太长,可能是2 Mb。在单个视图内嵌套256个表和视图。这可能是一个单独的表被多次计数。它也可能包含内部生成的表格。我记得当我达到这个限制时,无法在256桌附近的任何位置进行计数。 CTE的可能是相似的,虽然我找不到任何具体的文件来验证。 – jmarkmurphy

回答

0

这是一团糟。错误发生后出错。我能解决这个问题的唯一方法就是创建视图并将它们拼凑在一起。

当创建视图时,我只能使它与一个CTE不是多个一起工作,那么作为一个递归CTE工作得很好,在尝试定义视图时不起作用。我不得不将子查询拆分成视图,并且我不能创建一个包含子查询的SELECT rownumber()over(由COL1,Col2分区)的视图,我不得不将它分解成两个视图。如果我使用视图作为其子查询来调用SELECT rownumber()(由COL1,Col2分区),并将其扔到CTE中,它将无法工作。我不得不把SELECT的rownumber()放到另一个视图的内部视图上,然后我可以在CTE中使用它,然后创建一个主视图。

此外,我得到的每个错误都是系统错误,而不是SQL。

所以最后,如果有人遇到同样的问题,我很大程度上依赖于视图来解决我的问题。