【发布时间】:2010-11-25 20:22:41
【问题描述】:
我需要创建一个复制邻接模型中节点的 sql 存储过程 (Sql Server 2008 - T-SQL)。
表格可以看作有两列,Id 和 ParentId(FK 到 Id)。复制意味着所有的下属也需要复制。
我认为使用 WITH 是一个好的开始,但我很好奇是否可以在不使用 Cursors 的情况下完成此副本。
【问题讨论】:
标签: sql sql-server-2008 adjacency-list
我需要创建一个复制邻接模型中节点的 sql 存储过程 (Sql Server 2008 - T-SQL)。
表格可以看作有两列,Id 和 ParentId(FK 到 Id)。复制意味着所有的下属也需要复制。
我认为使用 WITH 是一个好的开始,但我很好奇是否可以在不使用 Cursors 的情况下完成此副本。
【问题讨论】:
标签: sql sql-server-2008 adjacency-list
邻接表的根本问题是在 SQL 中没有通用的方法来提取整个子树,因此您已经遇到了一个问题,即在不使用游标的情况下识别需要复制的所有行。
如果可能,将您的邻接列表迁移到嵌套集模型,这样您就可以轻松识别子树的所有节点。但是,对于一般的插入和删除,嵌套集模型的维护比较复杂。
编辑:正如“a_horse_with_no_name”所指出的,是一种通用 SQL 处理邻接列表、递归公用表表达式的方法。
【讨论】:
复制整个子树有点问题,因为当你复制你的子树时,你要么是
在任何一种情况下,您都会在某些时候通过不一致的状态拖动数据 - 这表明您的设计存在一些问题(例如,您的记录是否需要有多个父项?如果是,那么您应该考虑重新设计)。
因此,您应该使用更完整的示例来更新答案。
一个解决方案是有一个临时表,选择插入应该不是问题,只是更新引用的 ID 会是一个问题。
所以
该过程需要这样进行,因为在初始 WITH INSERT 中很难更改 ID(记录 ID 和引用父级的 ID)。但是,如果有一个很好的函数只依赖于 max_id 或只依赖于旧 ID,那么它是可能的。
【讨论】: