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 从myTable 在哪里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
我不知道如何填写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;