SQL Server Tree Query - PullRequest
       7

SQL Server Tree Query

0 голосов
/ 17 февраля 2011

Мне нужна помощь - MS SQL Server Query. Я не большая часть администратора баз данных. У меня есть приложение с таблицей организации, которая состоит из отношений родитель-ребенок:

CREATE TABLE [dbo].[Organizations](
    [OrgPK] [int] IDENTITY(1,1) NOT NULL,
    [OrgParentFK] [int] NULL,
    [OrgName] [varchar](200) NOT NULL,
CONSTRAINT [PK__Organizations] PRIMARY KEY CLUSTERED

Пример данных выглядит так:

OrgPK,   OrgParentFK, OrgName
1,  0,  Corporate
2,  1,  Department A
3,  1,  Department B
4,  2,  Division 1
5,  2,  Division 2
6,  3,  Division 1
7,  6,  Section 1
8,  6,  Section 2

Я пытаюсь сгенерировать запрос, который возвращает путь организации на основе заданного OrgPK. Пример, если задано OrgPK = 7, запрос вернет «Корпорация / Отдел B / Отдел 1 / Раздел 1»

Если задать OrgPk = 5, возвращаемой строкой будет «Корпорация / Отдел A / Отдел 2»

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 17 февраля 2011
WITH  OrganizationsH (OrgParentFK, OrgPK, OrgName, level, Label) AS
(
    SELECT OrgParentFK, OrgPK, OrgName, 0, CAST(OrgName AS VARCHAR(MAX)) As Label
    FROM Organizations
    WHERE OrgParentFK IS NULL
    UNION ALL
    SELECT o.OrgParentFK, o.OrgPK, o.OrgName, level + 1,  CAST(h.Label + '/' + o.OrgName  VARCHAR(MAX)) As Label
    FROM Organizations o JOIN OrganizationsH h ON o.OrgParentFK = h.OrgPK
)

SELECT OrgParentFK, OrgPK, OrgName, level, Label
FROM OrganizationsH
WHERE OrgPK = 5

ч / т до marc_s

0 голосов
/ 18 февраля 2011

Это также можно решить, создав скалярную функцию:

-- SELECT [dbo].[ListTree](5)
CREATE FUNCTION [dbo].[ListTree](@OrgPK int)
RETURNS varchar(max)
AS
BEGIN
    declare @Tree varchar(MAX)
    set @Tree = ''

    while(exists(select * from dbo.Organizations where OrgPK=@OrgPK))
    begin
        select  @Tree=OrgName+'/'+@Tree,
                @OrgPK=OrgParentFK
        from    dbo.Organizations
        where   OrgPK=@OrgPK

    end
    return  left(@Tree,len(@Tree)-1)
END
...