Снежинка, Рекурсивный CTE , Получение строки ошибки «AAAA_50>BBBB_47>>CCCC_92» слишком длинное и будет усечено в «КОНКАТЕ»

#recursion #snowflake-cloud-data-platform #common-table-expression

Вопрос:

Я создаю рекурсивный CTE в snowflake для получения полного пути и получаю следующую ошибку:

Строка ‘AAAA_50>BBBB_47>>CCCC_92’ слишком длинная и будет усечена в ‘CONCAT’

Мой сценарий выглядит следующим образом: (он отлично работает для 2 уровней, начинает отказывать для 3-го уровня)

     with recursive plant 
    (child_col,parent_col,val )
    as 
    (
    select  child_col, '' parent_col , trim(child_col)  from My_view 
    where condition1 = 'AAA' 
    union all
    select  A.child_col,A.parent_col,                 
    concat(trim(A.child_col),'>')||trim(val)
    from My_view A 
    JOIN plant as B ON trim(B.child_col) = trim(A.parent_col) 
      )
      select distinct * from plant 
 

Ответ №1:

Скорее всего, тип данных child_col определен как VARCHAR (N), этот тип передается. Потому Что CONCAT Возвращает:

Тип данных возвращаемого значения совпадает с типом данных входных значений.

Попробуйте явно привести тип к строке, подобной этой cast(trim(child_col) as string) :

Полный код:

 with recursive plant (child_col,parent_col,val )
as (
select  child_col, '' parent_col , cast(trim(child_col) as string)
  from My_view 
 where condition1 = 'AAA' 
 union all
select  A.child_col, A.parent_col, concat(trim(A.child_col),'>')||trim(val)
  from My_view A 
  join plant as B ON trim(B.child_col) = trim(A.parent_col) 
)
select distinct * from plant
 

Помните, что рекурсия в Snowflake по умолчанию ограничена 100 циклами.
Если вы хотите их увеличить, вам необходимо обратиться в службу поддержки.

Ссылка: КОНКАТ Устранение неполадок рекурсивного CTE