2008-10-24 22 views
11

Dawno temu, gdy pracowałem w sklepie Oracle, wziąłem CONNECT_BY za pewnik. Teraz utknąłem pracy z SQL Server 2005 i mają pewne nieprzyjemne hierarchie obiektów. W szczególności mamy tabelę samo-odwołującą się, w której wszystkie rekordy podrzędne mają kolumnę z identyfikatorem rodzica. Obecnie mamy widok, który odwzorowuje dzieci na poziomy w hierarchii i nieprzyjemne zapytanie, które robi ciężki lifting, aby połączyć rodziców z dziećmi. Chociaż ta metoda działa, jest ona daleka od elegancji i zapachu skażenia. Jestem tylko ciekawy, jak inni ludzie pobierają hierarchiczne dane z SQL Server 2005.Hierarchiczne zapytania w SQL Server 2005

Odpowiedz

1

w SQL Server 2005 można użyć do tego celu wspólnych wyrażeń tabelarycznych (CTE).

+0

siła rekurencyjna jest with() ty. har har har. –

+0

Czy możesz pokazać przykład? –

25

Spowoduje to utworzenie typowej tabeli hierarchicznej i użycie CTE do wybrania struktury hierarchii i utworzenia ścieżki dla każdego elementu.

CREATE TABLE tblHierarchy (ID int, ParentID int NULL, Name varchar(128)); 

INSERT INTO tblHierarchy VALUES (1, NULL, '1'); 
INSERT INTO tblHierarchy VALUES (2, NULL, '2'); 
INSERT INTO tblHierarchy VALUES (3, NULL, '3'); 
INSERT INTO tblHierarchy VALUES (4, 1, '1.1'); 
INSERT INTO tblHierarchy VALUES (5, 1, '1.2'); 
INSERT INTO tblHierarchy VALUES (6, 4, '1.1.1'); 

WITH Parent AS 
(
    SELECT 
     ID, 
     ParentID, 
     Name AS Path 
    FROM 
     tblHierarchy 
    WHERE 
     ParentID IS NULL 

    UNION ALL 

    SELECT 
     TH.ID, 
     TH.ParentID, 
     CONVERT(varchar(128), Parent.Path + '/' + TH.Name) AS Path 
    FROM 
     tblHierarchy TH 
    INNER JOIN 
     Parent 
    ON 
     Parent.ID = TH.ParentID 
) 
SELECT * FROM Parent 

WYJŚCIE:

ID ParentID Path 
1 NULL  1 
2 NULL  2 
3 NULL  3 
4 1  1/1.1 
5 1  1/1.2 
6 4  1/1.1/1.1.1 
3

Wystarczy FYI. SQL Server 2008 obsługuje nowy typ danych: Hierarchy ID.

2

Przeczytaj to:

http://www.sitepoint.com/article/hierarchical-data-database/2/

Należy podać kilka pomysłów ...

+0

Tak, zestawy zagnieżdżone są zdecydowanie drogą do uzyskania nieograniczonej hierarchii w RDBMS. Opis Sitepoint sprawia, że ​​brzmi to nieco bardziej skomplikowanie, niż jest w rzeczywistości, a implementacje można uprościć, np. przez "kolejność rangi" i "rangę następnego rodzeństwa" zamiast "lewej" i "prawej". – bobince

3

Po stosować zarówno znalazłem CONNECT BY jest nieco bardziej elastyczne i łatwiejsze w użyciu niż CTE jest. Pytanie nie różni się od tego, na które odpowiedziałem kilka tygodni temu. Zobacz artykuł Here, gdzie znajduje się krótkie porównanie instrukcji CONNECT BY i CTE oraz Here, aby uzyskać przykład zapytania za pomocą CTE.

+0

Przyjemność, że CONNECT BY nie istnieje w MSSQL. –

0

przemierzać głębokości Hierarchii pierwszy potem następny poziom rodzeństwo, CTE można stosować:

declare @tempTable TABLE 
(
    ORGUID int, 
    ORGNAME nvarchar(100), 
    PARENTORGUID int, 
    ORGPATH nvarchar(max) 
) 

;WITH RECORG(ORGuid, ORGNAME, PARENTORGUID, ORGPATH) 
as 
(
    select 
     org.UID, 
     org.Name, 
     org.ParentOrganizationUID, 
     dbo.fGetOrganizationBreadcrumbs(org.UID) 
    from Organization org 
    where org.UID =1 

    union all 

    select 
     orgRec.UID, 
     orgRec.Name, 
     orgRec.ParentOrganizationUID, 
     dbo.fGetOrganizationBreadcrumbs(orgRec.UID) 
    from Organization orgRec 
    inner join RECORG recOrg on orgRec.ParentOrganizationUID = recOrg.ORGuid 

) 
insert into @tempTable(ORGUID, ORGNAME, PARENTORGUID,ORGPATH) 

select ORGUID, ORGNAME, PARENTORGUID,ORGPATH 
from RECORG rec 

select * 
from @tempTable where ORGUID in(select MIN(tt.ORGUID) 
           from @tempTable tt 
           group by tt.PARENTORGUID) 
Powiązane problemy