SQL SELECT Parent-Child с сортировкой (... снова) - PullRequest
0 голосов
/ 26 ноября 2018

ОБНОВЛЕНО: У меня есть простая одноуровневая таблица родительских отношений со следующими уровнями столбцов:

ID_Asset| Parent_ID_Asset | ProductTitle

Мне нужен вывод, сгруппированный по Parent, потом по потомкам, а также отсортированный поИмя родителей и детей.Мои попытки в скрипке.

Подробнее см. Здесь: https://rextester.com/PPCHG20007

Желаемый порядок:

9   8   NULL  ADONIS Server
7   16  8     ADONIS Designer
8   20  8     ADONIS Portal Module “Control & Release” Package XS

Родитель вначале, чем потомки, а ProductTitle упорядочен по алфавиту.

Спасибо всем за подсказки.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Насколько я понимаю, вам нужно отсортировать по названию корневых продуктов, а между ними показать субпродукты, упорядоченные по названию, а между ними показать их субпродукты и т. Д.

Полагаю, вы используете рекурсивный cte.Вы можете определить помощника "сортировки иерархии", который является дополненным числом в текущем уровне, и для каждого уровня в глубину, добавить суффикс с дополненным числом в текущем уровне и т. Д.

Что-то вроде этого:

declare @Products table(ID int, Parent_ID int, ProductTitle varchar(100))
insert into @Products values
(1,    NULL,        'ADONIS'),
(2,    NULL,        'BACARAT'),
(3,    1,           'Portal Module'),
(4,    1,           'Alhambra'),
(5,    NULL,        'ZULU'),
(6,    2,           'Omega')


; with cte as (
select ID, Parent_ID, ProductTitle, FORMAT(ROW_NUMBER() over(order by ProductTitle), '0000') as SortingHelper
from @Products
where Parent_ID is null
union all
select p.ID, p.Parent_ID, p.ProductTitle, cte.SortingHelper + '.' + FORMAT(ROW_NUMBER() over(order by p.ProductTitle), '0000') as SortingHelper
from @Products p
inner join cte on cte.ID = p.Parent_ID
)

select ID, Parent_ID, ProductTitle
from cte
order by SortingHelper
0 голосов
/ 27 ноября 2018

Я думаю, что это заказ, который вы ищете.Это соединяет каждую строку с ее родителем (если он существует).Затем, если есть запись TP (родительская), то это родительский заголовок, идентификатор и т. Д., В противном случае текущая запись должна быть родительской.Я показал имя родителя в результатах запроса для ясности.Затем выполняется сортировка по

  • Имя родителя (чтобы родители и дети были вместе, но в порядке имен родителей)
  • Идентификатор родителя (в случае, если два или более родителей имеют одно имя / названиеэто сохранит детей с правильным родителем)
  • Флаг, который равен 0 для родителей, 1 для детей, поэтому родительский элемент идет первым
  • Текущее имя записи, которое будет сортировать детей по имени/ название порядка

Код

Select T.*, 
    isnull(TP.ProductTitle, T.ProductTitle) as ParentName  -- This is the parent name, shown for reference
from test T
    left outer join Test TP on TP.ID_Asset = T.Parent_ID_Asset  --This is the parent record, if it exists
ORDER BY isnull(TP.ProductTitle, T.ProductTitle),  --ParentName sort
    isnull(TP.ID_Asset, T.ID_Asset),  --if two parents have the same title, this makes sure they group with their correct children
    Case when T.Parent_ID_Asset is null then 0 else 1 end,  --this makes sure the parent comes before the child
    T.ProductTitle  --Child Sort
0 голосов
/ 26 ноября 2018

Вместо этого я бы сделал условное упорядочение:

select t.*
from table t
order by (case when parent_id is null then id else parent_id end), ProductTitle;

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

...