我们可以在返回表数据集的计算列上创建索引吗?

问题描述 投票:0回答:1

我们可以在下面的计算列上创建索引吗?我收到错误,不确定我是否走在正确的道路上。

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 中还有其他方法。我将尝试不断更新此线程以了解如何使用其他方法(使用上表示例)。

sql-server calculated-columns sql-server-2019
1个回答
0
投票

更新了我的帖子,添加了有关如何使用 IsDescendantOf 的解决方案

© www.soinside.com 2019 - 2024. All rights reserved.