Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 在SQLServer2005中设置层次结构的最佳方法是什么?_Sql Server 2005_Hierarchy - Fatal编程技术网

Sql server 2005 在SQLServer2005中设置层次结构的最佳方法是什么?

Sql server 2005 在SQLServer2005中设置层次结构的最佳方法是什么?,sql-server-2005,hierarchy,Sql Server 2005,Hierarchy,我正试图为公司建立一个层次结构。我使用的是SQLServer2008,并使用层次结构id进行设置。但现在我需要回到SQLServer2005…和“就这么做”。。。不管怎样,我想用这种简单的方法来设置它- Id | ParentId | CompanyName | Desc 其中ParentId是一个int字段,用于存储父项的id。我猜根的ParentId为零。是否有更好的方法来设置层次结构 我真的没有那么复杂的层次结构要求。。。我想知道是什么让我猜想遍历层次结构更容易,使用层次结构更有效 乔·

我正试图为公司建立一个层次结构。我使用的是SQLServer2008,并使用层次结构id进行设置。但现在我需要回到SQLServer2005…和“就这么做”。。。不管怎样,我想用这种简单的方法来设置它-

Id | ParentId | CompanyName | Desc
其中
ParentId
是一个int字段,用于存储父项的id。我猜根的
ParentId
为零。是否有更好的方法来设置层次结构


我真的没有那么复杂的层次结构要求。。。我想知道是什么让我猜想遍历层次结构更容易,使用层次结构更有效

乔·塞尔科(Joe Celko)使用嵌套集的方法,在嵌套集中,表有一个“左”和“右”列引用层次结构,这是我通常看到的方法

乔·塞尔科可能会比我解释得更好

简单方法很好,适用于CTEs(通用表表达式)。然而,正如Kev所建议的,还有其他的方法有其优缺点


因此,最终这取决于您的确切需求,以及对数据执行的插入与分层查询的数量,因为不同方法的性能在这方面可能会有很大差异。

不幸的是,据我所知,您的设置方式是正确的。您现在无法轻松地遍历链接,因为您丢失了GetSenator和GetGenderant。一个合适的替代方法是使用CTE替换getAncenter和getDegenant,并递归地使用它们

下面是一个示例(使用菜单层次结构):

本文应该会有所帮助(示例如下所示):

WITH MenuCTE(MenuKey, ParentMenuKey, MenuName) AS
(
-- Anchor Query
SELECT MenuKey, ParentMenuKey, MenuName FROM Menu WHERE MenuKey = 1
UNION ALL
-- Recursive Query
SELECT m.MenuKey, m.ParentMenuKey, m.MenuName FROM Menu m
INNER JOIN MenuCTE r ON m.ParentMenuKey = r.MenuKey
)
SELECT MenuKey, ParentMenuKey, MenuName FROM MenuCTE