Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在一列和联接表中使用树列表子名称的SQL Server查询_Sql Server_Treelist - Fatal编程技术网

Sql server 在一列和联接表中使用树列表子名称的SQL Server查询

Sql server 在一列和联接表中使用树列表子名称的SQL Server查询,sql-server,treelist,Sql Server,Treelist,我有三张桌子: 文章: 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 bev

我有三张桌子:

文章

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

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个级别,但实际上可以是无限级别)

因此,我需要在一列中包含所有层次结构名称的名称,在名称之间包含一些内容,比如一篇文章中的“-”


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

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

首先确保组表层次结构中没有循环,如果组表中有大量记录,则确保表的Id(包括名称)上有索引和ParentId上的另一个索引(也包括名称)

然后类似这样的东西(如果没有表定义,实际上无法进行测试)应该可以做到:

;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存储递归结果,然后创建聚集索引并进行连接。

为什么不编写一个查询来获取结果?这就是我要做的。我需要查询,如果你知道写在我的例子上这是一个人们回答问题的网站。如果你需要有人为你编写代码,你应该雇佣一个开发人员。我需要快速查询,工作要快,而不是递归查询更快,我不知道如果你写了一个执行速度太慢的递归查询,你应该发布它和它的执行计划,这样我们才能帮助解决真正的问题。无用的,写你的更快的方式,我会尝试,字没有任何意义我告诉你没有更快的方式。这就是你问题的答案。你说你需要比递归查询更快的东西。这只是一个例子,我需要的是,我在连接中得到了11个表(内部和左侧),还有动态添加,其中条件取决于用户过滤器,没有一个会改变我的答案。递归查询仍然是您最快的解决方案。我在这里的时间不超过2年,是时候在接下来的4年里避免这种“帮助”了