【问题标题】:DB2 getting QDT Array List maximum exceeded using CTE and sql recursionDB2 使用 CTE 和 sql 递归获得 QDT 数组列表最大值
【发布时间】:2017-08-24 01:34:36
【问题描述】:

我正在使用 CTE 创建递归查询以将多列数据合并为一个。

我有大约 9 个可用的 CTE(我需要在每个请求的一行中多次合并列,所以我有 CTE 助手)。当我添加第 10 个时,出现错误。我在 Visual Studio 2010 上运行查询,这是错误:

在使用 WRKOBJLCK MyUserProfile *USRPRF 命令的 As400 系统上,我看到了:

我找不到这方面的任何信息。

我正在使用在 AS400 系统上运行的 DB2,并使用:操作系统: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 代表什么,我什么时候在这里使用数组?

【问题讨论】:

  • QDT = 查询定义模板。我相信它类似于查询计划。
  • 啊,好的,谢谢。对我来说,这听起来像是说 sql 行太长的一种复杂方式,但我认为它会更具体。也许 CTE 被存储在一个数组中?
  • 我知道我之前已经达到了嵌套表的限制,也许这就是正在发生的事情。我不认为 SQL 语句太长,可以是 2 Mb。嵌套在单个视图中的表和视图限制为 256 个。可能是单个表被多次计算。它还可能包括内部生成的表。我记得当我达到这个限制时,我无法计算 256 张桌子附近的任何地方。 CTE 可能类似,但我找不到任何具体的文档来验证这一点。
  • @jmarkmurphy 任何关于我可以尝试提升(如果甚至是一个选项)以尝试解决此问题的最大存储空间的建议。
  • 不太可能有任何可以调整的...除了您的查询。 SQL0901 和 CPF4204 表示存在操作系统问题。如果您使用的是受支持的版本,您可以致电 IBM。

标签: sql ibm-midrange db2-400


【解决方案1】:

这是一团糟。一错再错。我可以解决这个问题的唯一方法是创建视图并将它们拼凑在一起。

在创建视图时,我只能让它与一个 CTE 而不是多个一起工作,然后作为一个递归 CTE 工作得很好,在尝试定义为视图时就不起作用了。我必须将子查询分解为视图,并且无法从包含子查询的 SELECT rownumber() over(partition by COL1, Col2) 创建视图,我必须将其分解为两个视图。如果我使用视图作为其子查询调用 SELECT rownumber() over(partition by COL1, Col2) 并将其放入 CTE,它将无法工作。我必须将 SELECT rownumber() over(partition by COL1, Col2) 及其内部视图放到另一个视图中,然后我才能在 CTE 中使用它,然后从所有这些中创建一个主视图。

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

因此,总而言之,如果有人遇到同样的问题,我会严重依赖视图来解决我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 2018-02-24
    • 2012-08-18
    • 2017-12-11
    • 2019-03-05
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多