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.

Итак, в заключение, я в значительной степени полагался на представления, чтобы решить мою проблему, если кто-нибудь когда-либо сталкивался с этой же проблемой.

Другие вопросы по тегам