СОРТИРОВКА Иерархических запросов в SQL Server 2005 - PullRequest
7 голосов
/ 23 января 2009

У меня следующая проблема: у меня есть таблица для ведения иерархических данных. Я хотел бы использовать CTE из SQL 2005.

WITH tree (id, parentid, code, name) AS
(
    SELECT id, ofs.ParentID, ofs.code, ofs.name
      FROM OrganizationFeatures ofs
     WHERE ofs.ParentID IS NULL

    UNION ALL

    SELECT ofs.id, ofs.ParentID, ofs.code, ofs.name
      FROM OrganizationFeatures ofs
      JOIN tree ON tree.ID = ofs.ParentID
)

select * from tree

Но я бы хотел отсортировать по коду, и результат будет следующим:

1
1/1
1/1/1
1/1/2
1/2/1
1/2/2
2
4/1

и т.д.. Есть идеи?

Ответы [ 2 ]

4 голосов
/ 23 января 2009

Чтобы получить объединенные значения, вам нужно сделать это в.

Для сортировки необходимо добавить заказ в последний выбранный.

WITH tree (id, parentid, code, name) AS
(
    SELECT id, ofs.ParentID, ofs.code, ofs.name
      FROM OrganizationFeatures ofs
     WHERE ofs.ParentID IS NULL

    UNION ALL

    SELECT ofs.id, ofs.ParentID, tree.code+'/'+ofs.code, ofs.name
      FROM OrganizationFeatures ofs
      JOIN tree ON tree.ID = ofs.ParentID
)

select * from tree order by code

Кроме того, если код не является varchar, вам придется преобразовать столбцы кода в этот бит кода (tree.code+'/'+ofs.code), чтобы он работал.

2 голосов
/ 26 января 2009

Локи, у меня был похожий запрос, но он сортировался не по названию, как я хотел, а по коду - была пятница, и я был перегружен.

В любом случае, выполнение вашего запроса дало мне ошибку, необходимо привести; Я должен был изменить это следующим образом:

WITH tree (id, parentid, name, code) AS
(
    SELECT id, ofs.ParentID, ofs.name, CAST(ofs.name as varchar(255))
      FROM OrganizationFeatures ofs
     WHERE ofs.ParentID IS NULL

    UNION ALL

    SELECT ofs.id, ofs.ParentID, ofs.name, CAST(tree.code+'/'+ofs.name as varchar(255))
      FROM OrganizationFeatures ofs
      JOIN tree ON tree.ID = ofs.ParentID
)

select * from tree order by code

Проблема в том, что необходимо привести к varchar, несмотря на то, что зовут varchar. Вполне возможно, что varchar (255) недостаточно с большими деревьями.

Итак, я сделал версию, в которой вышеупомянутая проблема не так велика:

WITH tree (id, parentid, name, code) AS
(
    SELECT id, ofs.ParentID, ofs.name, 
           CAST(ROW_NUMBER() OVER (ORDER BY ofs.name ASC) as varchar(255)) 
      FROM OrganizationFeatures ofs
     WHERE ofs.ParentID IS NULL

    UNION ALL

    SELECT ofs.id, ofs.ParentID, ofs.name, 
           CAST(tree.code +'/' + CAST(ROW_NUMBER() OVER (ORDER BY ofs.name ASC) as varchar(255)) as varchar(255))
      FROM OrganizationFeatures ofs
      JOIN tree ON tree.ID = ofs.ParentID
)

select * from tree order by code

Но мне не нравится такое решение, где необходимо разыграть. Есть ли лучшее решение?

...