Я конвертирую некоторый код Oracle в SQL Server.Сортировка нескольких родительских/дочерних элементов в рекурсивном запросе SQL
код Oracle выглядит следующим образом:
SELECT FLEX_VALUE, DESCRIPTION, ADMIN_ENABLED, PARENT_FLEX_VALUE, DISPLAY_DESC, LEVEL
FROM ( SELECT FLEX_VALUE, DESCRIPTION, ADMIN_ENABLED, PARENT_FLEX_VALUE, vDescField AS DISPLAY_DESC
FROM GL_SEGMENT2
WHERE PERIOD_YEAR = 2015;)
CONNECT BY PRIOR FLEX_VALUE = PARENT_FLEX_VALUE
START WITH PARENT_FLEX_VALUE IS NULL
ORDER SIBLINGS BY DISPLAY_DESC;
И он производит следующие корректные результаты:
группирует запроса данных их родителей, а также уровни обозначены. Результаты упорядочиваются родительскими группами. «Дети» под заголовками групп, похоже, не заказываются. Данные хранятся в одной таблице.
Я преобразовал запрос Oracle в следующем запросе SQL Server:
WITH n ([FLEX_VALUE], [DESCRIPTION], [ADMIN_ENABLED], [PARENT_FLEX_VALUE], [DISPLAY_DESC], [LEVEL]) AS
(SELECT P1.[FLEX_VALUE], P1.[DESCRIPTION], P1.[ADMIN_ENABLED], P1.[PARENT_FLEX_VALUE], P1.[DISPLAY_DESC], 1 AS [LEVEL]
FROM (SELECT [FLEX_VALUE], [DESCRIPTION], [ADMIN_ENABLED], [PARENT_FLEX_VALUE], [FLEX_VALUE] + ' - ' + [DESCRIPTION] AS [DISPLAY_DESC]
FROM dbo.FIN_REP_GL_SEGMENT2
WHERE [PERIOD_YEAR] = 2015) AS P1
WHERE LEN(LTRIM(RTRIM(ISNULL(P1.[PARENT_FLEX_VALUE],'')))) = 0
UNION ALL
SELECT C1.[FLEX_VALUE], C1.[DESCRIPTION], C1.[ADMIN_ENABLED], C1.[PARENT_FLEX_VALUE], C1.[DISPLAY_DESC], Parent.[LEVEL] + 1
FROM (SELECT [FLEX_VALUE], [DESCRIPTION], [ADMIN_ENABLED], [PARENT_FLEX_VALUE], [FLEX_VALUE] + ' - ' + [DESCRIPTION] AS [DISPLAY_DESC]
FROM dbo.FIN_REP_GL_SEGMENT2
WHERE [PERIOD_YEAR] = 2015) AS C1
JOIN n Parent ON Parent.[FLEX_VALUE] = C1.[PARENT_FLEX_VALUE])
SELECT [FLEX_VALUE], [DESCRIPTION], [ADMIN_ENABLED], [PARENT_FLEX_VALUE], [DISPLAY_DESC], [LEVEL]
FROM n
ORDER BY [DISPLAY_DESC]
Этот запрос SQL-сервер производит некорректной сортировкой, как показано ниже:
Уровни кажутся правильно, но дети отображаются под неправильными родительскими категориями (обратите внимание на значения B145 и Cnnn). Запись B145 должна отображаться под родителем F000, а записи Cnnn должны отображаться под родителем L000. В настоящее время SQL Query помещает их под родителем B000, что неверно!
SQL-запрос, похоже, сортируется по столбцу FLEX_VALUE, независимо от того, к какому «родительскому» принадлежит «ребенок».
Первопричина [так в оригинале] вопрос, кажется, что есть НЕСКОЛЬКО корневые записи с NULL в их PARENT_FLEX_VALUE, и я на самом деле хочу, чтобы игнорировать буквенную сортировку по FLEX_VALUE (я только обеспокоен с РОДИТЕЛЬСКИЙ СОРТИРОВОЧНЫЙ ЗАКАЗ).
Все, что я пытаюсь выполнить с SQL-запросом, не изменяет порядок сортировки.
Помимо проблемы сортировки и группировки, запрос в основном работает.
Повторно обработанный пример моей текущей попытки запроса SQL Server с объяснением причин, по которым он в настоящее время не работает, будет очень оценен.
Не проблема, что у вас есть заказ DISPLAY_DESC? –
№. DISPALY_DESC просто согласовывает FLEX_VALUE с ОПИСАНИЕМ. Уже пробовали сортировку по FLEX_VALUE и PARENT_FLEX_VALUE. Нет эффекта. Сортировка по PARENT_FLEX просто помещает всех родителей в верхнюю часть списка. Он не показывает иерархию - это то, что я хочу. – user1058946
Я бы предположил, что заказ должен быть «PARENT_FLEX_VALUE, CASE WHEN LEVEL = 1 THEN 1 ELSE 0 END, DISPLAY_DESC' – MickyT