我有 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 个级别,但实际上可以是无限级别(
所以我需要在一列中所有层次结构名称的名称,名称之间有类似"-"之类的名称。
我希望有人得到快速查询,因为它在真实数据库中有数千篇文章
首先,请确保组表层次结构中没有循环,如果组表包含大量记录,请确保该表在 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 创建一个物理(或临时(表来存储递归结果,创建聚集索引并在之后联接。
对于您想要的,没有比递归查询更快的解决方案了。