DB2 получает максимум списка массивов QDT с использованием рекурсии CTE и sql
Я использую CTE для создания рекурсивного запроса для объединения нескольких данных столбца в один.
У меня есть около 9 рабочих CTE (мне нужно объединить столбцы несколько раз в одной строке для каждого запроса, поэтому у меня есть помощники CTE). Когда я добавляю 10-е, я получаю ошибку. Я выполняю запрос в Visual Studio 2010, и вот ошибка:
А в системе As400 с помощью команды WRKOBJLCK MyUserProfile *USRPRF я вижу:
Я не могу найти никакой информации по этому вопросу.
Я использую 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 и когда я использую массив здесь?
1 ответ
Это был беспорядок. Ошибка за ошибкой. Единственный способ обойти это - создать представления и соединить их воедино.
При создании представления я смог заставить его работать только с одним CTE, а не с несколькими, тогда то, что хорошо работало как один рекурсивный CTE, не сработало бы при попытке определить его как представление. Мне пришлось разбить подзапрос на представления, и я не смог создать представление из SELECT rownumber() over(разбиение по COL1, Col2), содержащее подзапрос, мне пришлось разбить его на два представления. Если бы я вызвал SELECT rownumber() over(partition by COL1, Col2), используя представление в качестве подзапроса, и бросил его в CTE, это не сработало бы. Мне пришлось поместить SELECT rownumber () поверх (разделение по COL1, Col2) с его внутренним представлением в другое представление, а затем я смог использовать его в CTE, а затем создать главное представление из всего этого.
Кроме того, каждая ошибка, которую я получил, была системной ошибкой, а не SQL.
Итак, в заключение, я в значительной степени полагался на представления, чтобы решить мою проблему, если кто-нибудь когда-либо сталкивался с этой же проблемой.