【发布时间】: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