Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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
如何在T-SQL中检查邻接列表层次结构的有效性_Sql_Sql Server 2008_Tsql_Validation_Hierarchy - Fatal编程技术网

如何在T-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 |

我使用邻接列表格式在MS SQL数据库中存储大型层次结构。每个项目都有一个
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顺序排列,没有任何无序项和跳过的数字来检查有效性。我希望我已经解释清楚了。