SQL从父引用表中以父子顺序检索父子关系

问题描述 投票:0回答:2

我使用以下查询从自引用父表的表中检索父子关系数据。

    -- go down the hierarchy and get the childs
    WITH ChildLocations(LocationId, FkParentLocationId, [Level]) 
        AS 
        (
            (
                -- Start CTE off by selecting the home location of the user
                SELECT l.LocationId, l.FkParentLocationId, 0 as [Level]
                FROM   Location l
                WHERE  l.LocationId = @locationId
            )
            UNION ALL 
            -- Recursively add locations that are children of records already found in previous iterations.
            SELECT l2.LocationId, l2.FkParentLocationId, [Level] + 1
            FROM   ChildLocations tmp
                   INNER JOIN Location l2
                        ON  l2.FkParentLocationId = tmp.LocationId
        )
    INSERT INTO @tmp
    SELECT * from ChildLocations;

该表具有以下字段:LocationId,FkParentLocationId,FkLocationTypeId等...

这很好,但是我要如何检索它如下:

Parent 1
    Child 1
    Child 2
      Child 21
    Child 3
      Child 31
Parent 2
    Child 4
    Child 5
    Child 6

目前提供的是这样的:

Parent 1
Parent 2
    Child 1
    Child 2
    Child 3
    Child 4
 etc....

如何修改上面的内容以按我想要的顺序获得它。

sql hierarchy
2个回答
1
投票

如何追加“订单”字段?这可能是一种方法:

WITH ChildLocations(LocationId, FkParentLocationId, [Level]) 
    AS 
    (
        (
            -- Start CTE off by selecting the home location of the user
            SELECT l.LocationId, l.FkParentLocationId, 0 as [Level],
                   cast( str( l.locationId ) as varchar(max) ) as orderField
            FROM   Location l
            WHERE  l.LocationId = @locationId
        )
        UNION ALL 
        -- Recursively add locations that are children ...
        SELECT l2.LocationId, l2.FkParentLocationId, [Level] + 1,
               tmp.orderField + '-' + 
               str(tmp.locationId) as orderField
        FROM   ChildLocations tmp
               INNER JOIN Location l2
                    ON  l2.FkParentLocationId = tmp.LocationId
    )
SELECT * from ChildLocations order by orderField;

0
投票

我想要下面的数据而不使用水平定标

© www.soinside.com 2019 - 2024. All rights reserved.