在邻接模型中复制

时间:2010-11-24 12:47:10

标签: sql sql-server-2008 adjacency-list

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

表可以看作有两列,Id和ParentId(FK到Id)。复制意味着还需要复制所有下属。

我认为使用WITH是一个好的开始,但我很好奇我是否可以在不使用游标的情况下进行此复制。

2 个答案:

答案 0 :(得分:1)

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

如果可能,请将邻接列表迁移到嵌套集模型,以便轻松识别子树的所有节点。但是,对于常规插入和删除,嵌套集模型的维护更加复杂。

编辑:正如'a_horse_with_no_name'所指出的,在通用SQL中处理邻接列表,递归公用表表达式的一种方式。

答案 1 :(得分:0)

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

  • 非正规化数据或
  • 使用它作为某种类型的模板。

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

所以,你应该用你想要做的更完整的例子来更新答案。

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

所以

  1. WITH INSERT进入临时表
  2. 更新ID
  3. INSERT into original table
  4. 删除临时记录
  5. 该过程需要像这样,因为在初始WITH INSERT中很难更改ID(记录ID和引用父项的ID)。但是,如果有一个很好的函数只依赖于max_id或仅依赖于旧ID,那么它可能是可能的。