Рекурсивный запрос SQL с использованием массива с числовым типом

John Doe спросил: 31 июля 2018 в 09:34 в: sql

Я пытаюсь запустить рекурсивный запрос, чтобы получить кратчайшие пути, где идентификатор должен появляться один раз в пути не более. Представление, которое я использую, выглядит так:

pkp_symmetric(
    personknows numeric(20,0),
    personisknown numeric(20,0),
    creation timestamp)


При запуске

with recursive temp(persStart, persNext, pfad, tiefe, pcycle ) 
            as 
            (select pkp.personknows, pkp.personIsKnown, array[pkp.personKnows], 1, false 
            from pkp_symmetric pkp--pidstart, pidstart, pidstart
            union all 
            select p.personknows, p.personisknown, t.pfad|| t.persNext, t.tiefe + 1, p.personknows = ANY(t.pfad)  
            from pkp_symmetric p join  temp t 
            on p.personknows = t.persNext where not pcycle )            select * from temp t 

Я получаю следующую ошибку:

SQL Error [42804]: ERROR: recursive query "temp" column 3 has type numeric(20,0)[] in non-recursive term but type numeric[] overall
  Hinweis: Cast the output of the non-recursive term to the correct type.
  Position: 119
  SQL Error [42804]: ERROR: recursive query "temp" column 3 has type numeric(20,0)[] in non-recursive term but type numeric[] overall
  Hinweis: Cast the output of the non-recursive term to the correct type.
  Position: 119
    SQL Error [42804]: ERROR: recursive query "temp" column 3 has type numeric(20,0)[] in non-recursive term but type numeric[] overall
  Hinweis: Cast the output of the non-recursive term to the correct type.
  Position: 119
      SQL Error [42804]: ERROR: recursive query "temp" column 3 has type numeric(20,0)[] in non-recursive term but type numeric[] overall
  Hinweis: Cast the output of the non-recursive term to the correct type.
  Position: 119
        ERROR: recursive query "temp" column 3 has type numeric(20,0)[] in non-recursive term but type numeric[] overall
  Hinweis: Cast the output of the non-recursive term to the correct type.
  Position: 119
        ERROR: recursive query "temp" column 3 has type numeric(20,0)[] in non-recursive term but type numeric[] overall
  Hinweis: Cast the output of the non-recursive term to the correct type.
  Position: 119

Я был бы признателен за помощь. С уважением.

1 ответ

Есть решение
a_horse_with_no_name ответил: 31 июля 2018 в 09:44

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

select pkp.personknows, pkp.personisknown, array[]::numeric[] || pkp.personknows
...

в нерекурсивной части.

Я понятия не имею, почему array [personknows ] :: numeric [] не достигает того же самого.

a_horse_with_no_name ответил: 31 июля 2018 в 09:45
@JohnDoe: см. Мое редактирование
John Doe ответил: 31 июля 2018 в 09:38
Я пытался, но это не работает для меня. Я все еще получаю ту же ошибку.
John Doe ответил: 31 июля 2018 в 09:54
Большое спасибо. Это решило проблему.