SQL Server在一列中使用树状列表子名称查询并连接表[关闭]

问题描述 投票:-4回答:2

我有3张桌子:

文章:

Id, Name, Gropu, Measure, Price
----------------------------------
1, Coffee, 2, 1, 2.95
2, Tea, 2, 1, 1.95
3, CocaCola, 1, 1, 2,95

测量:

Id, Name
---------
1, Cup

组:

Id, ParentId, Name
----------------------
1, null, Beverages
2, 1, Hot beverages

所以想法是加入所有表并获得如下表所示的数据

Article.Id, Article.Name, Article.Group, Group.Name, Article.Measure, Measure.Name, Article.Price
-----------------------------------------------------------------------------------------------------
1, Coffee, 2, Beverages - Hot beverages, 1, Cup, 2.95
2, Tea, 2, Beverages - Hot beverages, 1, Cup, 1.95
3, CocaCola, 1, Beverages, 1, Cup, 2.95 

所有我需要的是,我在同一列中将所有树列表层次结构名称从顶部节点到最后一个用于文章(在此示例中,它只有2个级别,但实际上可以是无限级别)

所以我在一列中需要层级名称的所有名称,在一篇文章中使用“ - ”之类的名称。

我希望有人快速查询,因为它在真实数据库中有数千篇文章

sql-server treelist
2个回答
0
投票

首先确保Group表层次结构中没有循环,如果Group表有很多记录,那么请确保该表有Id(包括Name)的索引和ParentId上的另一个索引(也包括Name)。

那么这样的事情(实际上不能在没有表定义的情况下进行测试)应该可以做到这一点:

;WITH GroupHierarchy AS
(
    -- Anchor
    SELECT
        GroupId = G.Id,
        ParentId = G.ParentID,
        GroupName = G.Name,
        HierarchyName = CONVERT(VARCHAR(MAX), G.Name),
        Level = 1
    FROM
        [Group] AS G
    WHERE
        G.ParentID IS NULL

    UNION ALL

    -- Children
    SELECT
        GroupId = G.Id,
        ParentId = G.ParentId,
        GroupName = G.Name,
        HierarchyName = R.HierarchyName + '-' + G.Name,
        Level = R.Level + 1
    FROM
        GroupHierarchy AS R
        INNER JOIN [Group] AS G ON R.GroupId = G.ParentId
)
SELECT
    A.Id, 
    A.Name, 
    A.[Group], 
    G.HierarchyName, 
    A.Measure, 
    M.Name, 
    A.Price
FROM
    Article AS A
    INNER JOIN Measure AS M ON A.Measure = M.Measure
    INNER JOIN GroupHierarchy AS G ON A.[Group] = G.[GroupId]
OPTION 
    (MAXRECURSION 1000) -- Your max recursion depth

如果它仍然很慢,您可以尝试创建一个物理(或时间)表来使用SELECT INTO存储递归结果,创建聚簇索引并在之后加入。


1
投票

对于你想要的,没有比递归查询更快的解决方案。

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