Иерархические запросы в SQL Server 2005 - PullRequest
11 голосов
/ 25 октября 2008

Когда я работал в магазине Oracle, я воспринимал CONNECT_BY как должное. Теперь я застрял в работе с SQL Server 2005 и имею некоторые неприятные иерархии объектов. В частности, у нас есть собственная таблица ссылок, где все дочерние записи имеют столбец с идентификатором их родителя. В настоящее время у нас есть представление, которое отображает детей на уровни в иерархии, и неприятный запрос, который делает тяжелую работу, чтобы связать родителей с их детьми. Хотя этот метод работает, он далеко не элегантен и не пахнет. Мне просто любопытно, как другие люди получают иерархические данные из SQL Server 2005.

Ответы [ 6 ]

25 голосов
/ 25 октября 2008

Это создает типичную иерархическую таблицу и использует CTE для выбора иерархической структуры и создания пути для каждого элемента.

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

ВЫВОД:

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 голосов
/ 25 октября 2008

Используя оба, я обнаружил, что CONNECT BY несколько более гибкий и простой в использовании, чем CTE. Вопрос не отличается от того, на который я ответил несколько недель назад. См. Здесь для краткого сравнения CONNECT BY и CTE и Здесь для примера запроса с использованием CTE.

3 голосов
/ 25 октября 2008

Просто к вашему сведению. SQL Server 2008 поддерживает новый тип данных ИД иерархии .

2 голосов
/ 25 октября 2008

Читать это:

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

Это должно дать вам несколько идей ...

1 голос
/ 25 октября 2008

в SQL Server 2005 вы можете использовать для этого общие табличные выражения (CTE).

0 голосов
/ 02 марта 2012

Чтобы пройти Глубину Иерархии сначала, затем на следующий уровень родного брата, CTE можно использовать:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...