如何在T-SQL中检查邻接列表层次结构的有效性
我使用邻接列表格式在MS SQL数据库中存储大型层次结构。每个项目都有一个如何在T-SQL中检查邻接列表层次结构的有效性,sql,sql-server-2008,tsql,validation,hierarchy,Sql,Sql Server 2008,Tsql,Validation,Hierarchy,我使用邻接列表格式在MS SQL数据库中存储大型层次结构。每个项目都有一个IndexNumber和一个ParentIndexNumber列。IndexNumber列存储每个项目的序列号,ParentIndexNumber可用于计算层次结构深度 有一个非常罕见的bug会破坏层次结构的有效性,因此我希望有一个SQL脚本来测试其有效性,以便于测试和验证。以下是无效层次结构的示例: | IN | PIN | | |----|------|-------| | 3 | NULL |
IndexNumber
和一个ParentIndexNumber
列。IndexNumber列存储每个项目的序列号,ParentIndexNumber可用于计算层次结构深度
有一个非常罕见的bug会破坏层次结构的有效性,因此我希望有一个SQL脚本来测试其有效性,以便于测试和验证。以下是无效层次结构的示例:
| IN | PIN | |
|----|------|-------|
| 3 | NULL | |
| 4 | 3 | |
| 5 | 3 | |
| 6 | 4 | FAIL! |
| 7 | 6 | |
IndexNumber 6失败,因为IndexNumber 4的所有子代的IndexNumber应大于4,但它们不应在IndexNumber 4的同级之后存在,如IndexNumber 5。我通过一个简单的选择(如下面的选择)获得数据,但我可以测试有效性吗?对于较大的数据集和多个数据库,手动查看数据非常耗时。层次结构可以有7层深
SELECT
IndexNumber, ParentTopicIndexNumber
FROM
Items
ORDER BY IndexNumber;
我甚至不知道该使用哪种查询,可能是一个带有非常复杂where子句的select,但不知道从哪里开始。如果这太宽泛了——很好,它可以关闭,但我希望得到帮助或指针:)您需要一个递归公共表表达式来实现这一点:但我真的不明白为什么19/4会失败
indexnumber=19
是4
的直接后代。所以它是“低于”4。@一匹没有名字的马:干杯,我来看看,然后开始摆弄。我简化了这个例子,也许现在它更清楚了;6不能是4的孩子,因为5是4的兄弟姐妹,因此终止了4必须拥有的后代列表。这个解释有意义吗?如果你试图在头脑中呈现层次结构,这对你有意义吗?我们可以假设1和2的父项为空。IndexNumber不是一个随机ID,但表示项目必须遵循的顺序。我需要IndexNumber来跟踪兄弟项目的存在顺序。如果没有必要的话,我会使用ID来代替。@fiddle示例中带有\u no \u名称的\u horse\u可以呈现树路径,然后可以通过检查IDX列是否从1到n顺序排列,没有任何无序项和跳过的数字来检查有效性。我希望我已经解释清楚了。