в postgres ORDER BY, кажется, не работает в рекурсивном cte - PullRequest
1 голос
/ 23 января 2012

В cte select я объединяю id фиксированного размера в качестве ключа сортировки:

with recursive cte(
        uno_id,
        uno_tp,
        pnt_uno_id,
        status,
        title,
        content,
        sorter,
        depth ) 
as( select
        uno.uno_id,
        uno.uno_tp,
        uno.pnt_uno_id,
        uno.status,
        uno.title,
        uno.content,
        uno.uno_id::text,
        1
from    uno
where   uno.uno_id = \$1 

union all

select  uno.uno_id,
        uno.uno_tp,
        uno.pnt_uno_id,
        uno.status,
        uno.title,
        uno.content,
        cte.sorter || '-' || uno.uno_id::text,
        cte.depth + 1 AS depth
from    uno 
join    cte ON uno.pnt_uno_id = cte.uno_id
    )
select  *
from    cte
order   by sorter;

и вот список, показывающий столбцы uno_id и sorter:

1152288185909250, 1152288185909250
1158885255675908, 1152288185909250-1158885255675908
1158885255675906, 1152288185909250-1158885255675906
1158885255675907, 1152288185909250-1158885255675906-1158885255675907

Как видите, второй ряд неуместен - на самом деле он должен быть последним.

Как я могу это исправить?

<ч />

НИКОГДА. Постгрес работал правильно. Транспорт между сервером и клиентом не поддерживал правильное упорядочение массива.

Извините за ненужные царапины на голове и спасибо.

1 Ответ

1 голос
/ 23 января 2012

Должно быть какое-то недоразумение.Что-то, чего нет в вашем вопросе.
Рассмотрим следующую демонстрацию:

WITH cte (uno_id, sorter) AS (
    VALUES
      ('1158885255675908'::text, '1152288185909250-1158885255675908'::text)
     ,('1152288185909250', '1152288185909250')
     ,('1158885255675907', '1152288185909250-1158885255675906-1158885255675907')
     ,('1158885255675906', '1152288185909250-1158885255675906')
    )
SELECT  *
FROM    cte
ORDER   BY sorter;

Результат, как и ожидалось:

      uno_id      |                       sorter
------------------+----------------------------------------------------
 1152288185909250 | 1152288185909250
 1158885255675906 | 1152288185909250-1158885255675906
 1158885255675907 | 1152288185909250-1158885255675906-1158885255675907
 1158885255675908 | 1152288185909250-1158885255675908

Этот порядок сортировки работает для any версии PostgreSQL.(CTE нуждается в v8.4 +.)

...