我们可以在下面的计算列上创建索引吗?我收到错误,不确定我是否走在正确的道路上。
create table test_enty_hrcy
(
enty_key int not null primary key,
hrcyNode hierarchyid not null,
parent_enty_key int
)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (1, '/1/', null)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (2, '/1/2/', 1)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (3, '/1/3/', 1)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (4, '/1/2/4/', 2)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (8, '/1/2/4/8/', 4)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (14, '/1/2/4/8/14/', 8)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (15, '/1/2/4/8/15/', 8)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (20, '/1/2/4/8/15/20/', 15)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (21, '/1/2/4/8/15/21/', 15)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (9, '/1/2/4/9/', 4)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (5, '/1/2/5/', 2)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (10, '/1/2/5/10/', 5)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (11, '/1/2/5/11/', 5)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (6, '/1/3/6/', 3)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (7, '/1/5/7/', 3)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (12, '/1/5/7/12/', 7)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (13, '/1/5/7/13/', 7)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (18, '/1/5/7/13/18/', 13)
insert into test_enty_hrcy (enty_key, hrcyNode, parent_enty_key) values (19, '/1/5/7/13/19/', 13)
create unique index uk_tEH_hrcyNode on test_enty_hrcy(hrcyNode);
我使用下面的 CTE 查询获取输出(以获取所有后代),但想利用内置函数。
;WITH par_chd ( enty_key) AS
(
SELECT enty_key
FROM test_enty_hrcy
WHERE enty_key = 2
UNION ALL
SELECT ah.enty_key
FROM test_enty_hrcy ah
JOIN par_chd CH
ON ah.parent_enty_key = CH.enty_key
)
select enty_key from par_chd order by 1
找到了使用IsDescendantOf的方法
declare @parentHrcy hierarchyid
select @parentHrcy = hrcyNode
from test_enty_hrcy
where enty_key = 2
select enty_key from
test_enty_hrcy
where hrcyNode.IsDescendantOf(@parentHrcy) = 1
order by 1
我发现使用 HierarchyID 比使用 CTE 更有效。 HierarchyID 中还有其他方法。我将尝试不断更新此线程以了解如何使用其他方法(使用上表示例)。
更新了我的帖子,添加了有关如何使用 IsDescendantOf 的解决方案