【发布时间】:2014-03-27 09:50:21
【问题描述】:
感谢您抽出宝贵时间阅读这篇文章,非常感谢所有帮助。
我需要帮助创建一个 SQL 查询,该查询返回匹配或包含我的 WHERE 查询字符串的项目的所有祖先和后代。
我的桌子是这样的:
ID 层次结构 名称 1 / 产品 2 /1/ 汽车 3 /1/1/ 红色 4 /1/2/ 蓝色 5 /2/ 自行车 6 /2/1/ 绿色 7 /2/2/ 红色我想按描述搜索,所有匹配项都应该连同他们的后代和祖先一起返回。
例如搜索词 = '红色'
结果
ID 层次结构 名称 1 / 产品 2 /1/ 汽车 3 /1/1/ 红色 5 /2/ 自行车 7 /2/2/ 红色另一个例子:
搜索词 = 'bi'
Result(因为 bi 包含在 Bike 字符串中
ID 层次结构 名称 1 / 产品 5 /2/ 自行车 6 /2/1/ 绿色 7 /2/2/ 红色非常感谢,
罗伯
********** 编辑 28 -Mar-14 ***********
下面的查询我快到了。但是它只检索所有祖先而不是后代。
WITH Ancestors(Hierarchy, [Name], AncestorId) AS ( 选择 层次结构,[名称],层次结构.GetAncestor(1) 从 dbo.SpecProducts 在哪里 Name = 'Chrome' -- 或选择该节点所需的任何内容 联合所有 选择 ht.Hierarchy, ht.[名称], ht.Hierarchy.GetAncestor(1) 从 dbo.SpecProducts ht 内部联接 祖先 a ON ht.Hierarchy = a.AncestorId ) SELECT DISTINCT *, Hierarchy.ToString() FROM Ancestors****** 2014 年 3 月 7 日编辑 *************
@Yousseff DAOUI - 作为对您的回答的回应,我很难将您的代码转换为与我的表格一起使用。下面是我尝试让您的代码与我的表一起使用:
声明@p_name NVARCHAR = 'Gr';
WITH Temp AS (SELECT * FROM SpecProducts) -- 数据库表
,Temp_parents AS (
选择 ID、层次结构、名称 --、0 _Level
从
温度
在哪里
名称 LIKE '%'+@p_name+'%'
联合所有
SELECT tab.ID, tab.Hierarchy, tab.Name --, p._Level+1
从
温度选项卡
内部联接
Temp_parents p
ON p.Hierarchy LIKE tab.Hierarchy+'_/')
,Temp_descendants AS (
选择 ID、层次结构、名称 --、0 _Level
从
温度
在哪里
名称 LIKE '%'+@p_name+'%'
联合所有
SELECT tab.ID, tab.Hierarchy, tab.Name --, d._Level-1
从
温度选项卡
内部联接
Temp_descendants d
ON tab.Hierarchy LIKE d.Hierarchy+'_/')
选择 *
来自 Temp_parents
联盟
选择 *
FROM Temp_descendants
注意第 3 行如何尝试从名为 SpecProducts 的表中提取数据:
WITH Temp AS (SELECT * FROM SpecProducts) -- DB Table
但是,当我尝试执行代码时,MS SQL Server Management Studio 不断输出以下错误:
消息 403,第 16 级,状态 1,第 3 行 数据类型的运算符无效。运算符等于add,type等于hierarchyid。
你知道我怎样才能让它工作吗?
非常感谢。
** 第二次编辑 - 2014 年 3 月 7 日 *
这似乎好一点,但查询真的很慢(我认为它提取的行数超过了应有的行数)。是不是因为 HierarchyID '/' 被返回,然后找到根 '/' 的所有孩子,这就是一切?
DECLARE @p_name NVARCHAR = '壁纸';
WITH Temp AS (SELECT * FROM SpecProducts) -- 数据库表
,Temp_parents AS (
选择 ID、层次结构、名称 --、0 _Level
从
温度
在哪里
名称 LIKE '%'+@p_name+'%'
联合所有
SELECT tab.ID, tab.Hierarchy, tab.Name --, p._Level+1
从
温度选项卡
内部联接
Temp_parents p
ON p.Hierarchy.ToString() LIKE tab.Hierarchy.ToString()+'_/')
,Temp_descendants AS (
选择 ID、层次结构、名称 --、0 _Level
从
温度
在哪里
名称 LIKE '%'+@p_name+'%'
联合所有
SELECT tab.ID, tab.Hierarchy, tab.Name --, d._Level-1
从
温度选项卡
内部联接
Temp_descendants d
ON tab.Hierarchy.ToString() LIKE d.Hierarchy.ToString()+'_/')
选择 *
来自 Temp_parents
联盟
选择 *
FROM Temp_descendants
***** 第三次编辑 - 2014 年 3 月 7 日 *** ****
好的,对于编辑的数量真的很抱歉。但是现在这似乎基于 Yousseff 的代码。
DECLARE @p_name NVARCHAR(255) = 'natural';
WITH Temp_parents 作为(
选择 ID、层次结构、名称 --、0 _Level
从
规格产品
在哪里
名称 LIKE '%'+@p_name+'%'
联合所有
SELECT tab.ID, tab.Hierarchy, tab.Name --, p._Level+1
从
规格产品选项卡
内部联接
Temp_parents p
ON p.Hierarchy.ToString() LIKE tab.Hierarchy.ToString()+'_/')
,Temp_descendants AS (
选择 ID、层次结构、名称 --、0 _Level
从
规格产品
在哪里
名称 LIKE '%'+@p_name+'%'
联合所有
SELECT tab.ID, tab.Hierarchy, tab.Name --, d._Level-1
从
规格产品选项卡
内部联接
Temp_descendants d
ON tab.Hierarchy.ToString() LIKE d.Hierarchy.ToString()+'_/')
选择 *
来自 Temp_parents
联盟
选择 *
FROM Temp_descendants
【问题讨论】:
-
你试过我的脚本了吗?
标签: sql sql-server-2008-r2 hierarchy