SQL 在一列中使用树列表子名称的服务器查询并加入 table
SQL Server query with treelist child names in one column and join table
我有 3 个 table:
文章:
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
所以我的想法是加入所有 table 并获取如下 table 中的数据
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 个级别,但实际上可以是无限级别)
所以我需要在一列中包含所有层次结构名称的名称,名称之间有一些东西,例如一篇文章中的“-”。
我希望有人能快速查询,因为它在真实数据库中有数千篇文章
对于您想要的,没有比递归查询更快的解决方案了。
首先确保你的组 table 层次结构中没有循环,如果你的组 table 有很多记录,那么确保 table 有一个索引Id(包括Name)和ParentId(也包括Name)上的另一个索引。
那么像这样的东西(如果没有 table 定义就无法实际测试)应该可以解决问题:
;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
如果仍然很慢,您可以尝试创建一个物理的(或临时的)table 来存储使用 SELECT INTO 的递归结果,然后创建一个聚簇索引并加入。
我有 3 个 table:
文章:
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
所以我的想法是加入所有 table 并获取如下 table 中的数据
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 个级别,但实际上可以是无限级别)
所以我需要在一列中包含所有层次结构名称的名称,名称之间有一些东西,例如一篇文章中的“-”。
我希望有人能快速查询,因为它在真实数据库中有数千篇文章
对于您想要的,没有比递归查询更快的解决方案了。
首先确保你的组 table 层次结构中没有循环,如果你的组 table 有很多记录,那么确保 table 有一个索引Id(包括Name)和ParentId(也包括Name)上的另一个索引。
那么像这样的东西(如果没有 table 定义就无法实际测试)应该可以解决问题:
;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
如果仍然很慢,您可以尝试创建一个物理的(或临时的)table 来存储使用 SELECT INTO 的递归结果,然后创建一个聚簇索引并加入。