1

我需要创建一个复制邻接模型中的节点的 sql 存储过程(Sql Server 2008 - T-SQL)。

可以将表视为具有两列,Id 和 ParentId(FK 到 Id)。复制意味着所有的下属也需要被复制。

我认为使用 WITH 是一个好的开始,但我很好奇是否可以在不使用光标的情况下完成此副本。

4

2 回答 2

1

邻接表的基本问题是在 SQL 中没有通用的方法来提取整个子树,因此您已经遇到了一个问题,即在不使用游标的情况下识别需要复制的所有行。

如果可能,将您的邻接列表迁移到嵌套集模型,这样您就可以轻松识别子树的所有节点。但是,对于一般的插入和删除,嵌套集模型的维护更为复杂。

编辑:正如 'a_horse_with_no_name' 所指出的,一般 SQL 有一种方法来处理邻接列表、递归公用表表达式。

于 2010-11-24T13:21:18.190 回答
0

复制整个子树有点问题,因为当您复制子树时,您要么

  • 非规范化数据或
  • 使用它作为某种模板。

在任何一种情况下,您都会在某些时候通过不一致的状态拖动数据 - 这表明您的设计存在一些问题(例如,您的记录是否需要有多个父项?如果是,那么您应该考虑重新设计)。

因此,您应该使用更完整的示例来更新答案,以说明您正在尝试做什么。

一种解决方案是有一个临时表,选择插入应该不是问题,它只是更新引用的 ID,这将是一个问题。

所以

  1. WITH INSERT 插入临时表
  2. 更新 ID
  3. 插入原始表
  4. 删除临时记录

该过程需要像这样进行,因为在初始 WITH INSERT 中很难更改 ID(记录 ID 和引用父级的 ID)。但是,如果有一个仅依赖于 max_id 或仅依赖于旧 ID 的好函数,则它是可能的。

于 2010-11-25T12:22:41.187 回答