Родительские / дочерние отношения в sql - PullRequest
1 голос
/ 07 декабря 2011

Я пытаюсь определить таблицу SQL для групп и подгрупп, и до сих пор мой дизайн выглядит следующим образом

groupID groupname       parentgroupID
1       group1          null
2       group2          null
3       subgroup1.1     1
4       subgroup1.1.1   3

Я думаю, что я на правильном пути. Теперь я хотел бы получить данные для подгруппы 1.1.1, чтобы иметь возможность отображать их на уровне бизнеса

group1> подгруппа 1.1> подгруппа 1.1.1

Должен ли я сделать это в tsql, или я предполагаю сделать цикл в asp.net для получения всех доступных родительских групп?

Этот вопрос является вопросом sql и asp.net, поэтому я опубликую его в обеих категориях.

Спасибо за участие

1 Ответ

3 голосов
/ 07 декабря 2011

Вы можете решить эту проблему - при условии, что на SQL Server 2005 или новее с рекурсивным CTE:

-- define a CTE (Common Table Expression) with a name
;WITH groups AS
(
    -- define the "anchor" - those top-level rows
    SELECT 
        GroupID, GroupName, 
        CAST(NULL AS INT) AS 'ParentGroupID', 1 AS 'Level',
        CAST('# ' + GroupName AS VARCHAR(1000)) AS 'Breadcrumb'
    FROM @test
    WHERE ParentGroupID IS NULL

    -- recursive join - joins "child" rows to "parent" rows already in the result set       
    UNION ALL

    SELECT 
       t2.GroupID, t2.GroupName, t2.ParentGroupID, g.Level + 1 AS 'Level',
       CAST(g.Breadcrumb + ' > ' + t2.GroupName AS VARCHAR(1000))
    FROM @test t2
    INNER JOIN groups g ON t2.ParentGroupID = g.GroupID  -- join back to the CTE
)
SELECT * 
FROM groups

Это должно дать вам результаты примерно так:

GroupID  GroupName        ParentGroupID  Level  Breadcrumb
  1       group1             NULL          1     # group1
  2       group2             NULL          1     # group2
  3       subgroup1.1         1            2     # group1 > subgroup1.1
  4       subgroup1.1.1       3            3     # group1 > subgroup1.1 > subgroup1.1.1

Любое дополнительное форматирование должно выполняться в вашем интерфейсе (веб, клиент / сервер).

Столбец Level является дополнительным бонусом, сообщая вам, на каком уровне иерархии располагается каждая строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...