如何在SQL中更新ParentID字段

时间:2011-12-22 13:25:14

标签: sql sql-server

我有一些导入SQL的记录。其中一个字段'FieldToChage'是引用旧键值的ParentID。当我将数据导入SQL时,新键值与“FieldToChage”中包含的旧键值不对应。

以下是我导入的表的简化架构:

[dbo].[zChangeTable](
      [ID] [int] IDENTITY(1,1) NOT NULL,
      [FieldToChange] [int] NULL,
      [OldID] [int] NOT NULL,

我需要的是标题为'FieldToChange'(ParentID)的字段,用字段'OldID'中的旧索引引用新的键值。

以下是现有表格数据的示例:

ID      FieldToChange   OldID
159      NULL            143
160      143             142
161      143             145
25       174             171
26       174             172
204      NULL            173
17       NULL            174

因此需要一个更新语句,它会遍历表并更新'FieldToChange',如下所示......

ID      FieldToChange   OldID
159      NULL            143
160      159             142
161      159             145
25       17              171
26       17              172
204      NULL            173
17       NULL            174

希望这是有道理的......

提前致谢

4 个答案:

答案 0 :(得分:2)

UPDATE t
SET t.FieldToChange = t1.ID
FROM zChangeTable t JOIN zChangeTable t1 ON t.FieldToChange = t1.OldID

答案 1 :(得分:2)

这样做:

update zChangeTable
set t1.FieldToChange = t2.ID
from zChangeTable t1
inner join zChangeTable t2 on t1.FieldToChange = t2.OldID

答案 2 :(得分:1)

最简单的方法是分两部分进行导入:首先添加记录,然后返回并分配父ID列。为简单起见,我将使用表名OldTableNewTable

insert into NewTable
(
    OldID
)
select
    ID

from OldTable

update nt set
    FieldToChange = ntp.ID

from NewTable nt

join OldTable ot on ot.ID = nt.OldID
join NewTable ntp on ntp.OldID = ot.ParentID

答案 3 :(得分:0)

解决此问题的最简单方法是导入启用了Identity Insert的表,并保留标识列“ID”中的值。

SET IDENTITY_INSERT zChangeTable ON
GO
/* Import the data, including values for ID */
GO
SET IDENTITY_INSERT zChangeTable OFF
GO