Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 基于父级信息的更新列_Sql Server - Fatal编程技术网

Sql server 基于父级信息的更新列

Sql server 基于父级信息的更新列,sql-server,Sql Server,我是SQL Server的初学者,我有一个关于如何最好地做到这一点的问题 我有一张这样的桌子: IDParentLevel 1NULL0 211 311 422 522 632 722 854 943 1063 1163 如您所见,所有条目都有一个父项和一个级别,数据库以树结构组织。有些条目的级别设置不正确,例如条目ID 8。8的父级为5,ID 5的级别为2,因此8的级别应为3而不是4。我的表中有许多不正确的级别值,我不确定如何修复。到目前为止,我有: 更新myTable 设置级别=级别1 从m

我是SQL Server的初学者,我有一个关于如何最好地做到这一点的问题

我有一张这样的桌子:

IDParentLevel 1NULL0 211 311 422 522 632 722 854 943 1063 1163

如您所见,所有条目都有一个父项和一个级别,数据库以树结构组织。有些条目的级别设置不正确,例如条目ID 8。8的父级为5,ID 5的级别为2,因此8的级别应为3而不是4。我的表中有许多不正确的级别值,我不确定如何修复。到目前为止,我有:

更新myTable 设置级别=级别1 从myTable 在哪里


我不知道如何填写WHERE部分,或者这是否是最好的方法。非常感谢您的建议。

这将显示有问题的行

select
  a.id,
  a.level,
  b.level as parentlevel
from
  tablename a
  join tablename b on a.parent = b.id
where
  a.level <> b.level+1

如果您使用的是SQL Server 2005或SQL Server 2008,则可以使用递归CTE公共表表达式。这个过程非常简单,但下面是如何使用代码实现它

-创建临时表并插入值

创建表dbo.ctetest childid int主键不为null,parentid int为null,level int为null

插入dbo.ctetest childid,parentid选择1,NULL

插入dbo.ctetest childid,parentid选择2,1

插入dbo.ctetest childid,parentid选择3,1

插入dbo.ctetest childid,parentid选择4,2

插入dbo.ctetest childid,parentid选择5,2

插入dbo.ctetest childid,parentid选择6,3

插入dbo.ctetest childid,parentid选择7,2

插入dbo.ctetest childid,parentid选择8,5

插入dbo.ctetest childid,parentid选择9,4

插入dbo.ctetest childid,parentid选择10,6

插入dbo.ctetest childid,parentid选择11,6

-使用递归CTE中的级别数据更新表

使用递归的childid、parentid、level

作为

更新ct

设置级别=rc.level

从dbo.ctetest ct

连接递归CTE rc

ON ct.childid = rc.childid;
-验证结果

挑选*

来自dbo.ctetest

以下是上述查询的输出:

子ID父ID级别

1空0

2 1 1

3.1.1

4 2 2

5 2 2

6 3 2

7 2 2

853

9 4 3

106 3

11 6 3


请注意,我使用SQLServer2008测试了上述代码。我假设自2005年推出CTE以来,它将在SQL Server 2005中运行。

我担心我给你的任何建议都会很危险,因为我不知道你到底想实现什么。也许如果您给出了一些表应该是什么样子的指示,您可以使用光标来处理更新,但这会很混乱。首先要做的是修复最初导致此问题的部分。
ON ct.childid = rc.childid;