如何根据行索引更新表?

时间:2012-01-05 21:15:39

标签: sql sql-server-2008

我制作了这样的现有表的副本:

select * into table_copy from table

从那时起,我对表进行了一些架构更改(添加/删除了列,更改了列的顺序等)。现在我需要运行一个更新语句来填充我添加的新列,如下所示:

update t
set t.SomeNewColumn = copy.SomeOldColumn
from t

但是,如何根据行索引而不是某些列值匹配来获取第二个表?

注意:两个表的原始位置仍然具有相同的行数。

4 个答案:

答案 0 :(得分:3)

如果你有一个ID,你可以这样做:

update t set
    t.SomeNewColumn = copy.SomeOldColumn
from
    table t
    inner join table_copy copy on
        t.id = copy.id

如果你无法唯一地识别行并且依赖于行的顺序,那么你运气不好,因为在任何版本的SQL Server(大多数其他RDBMS)中行顺序都不可靠。 / p>

答案 1 :(得分:3)

如果没有键来连接表,则无法唯一地定义每一行,表中数据的位置与情况无关。

如果表没有主键,则需要定义一个。

答案 2 :(得分:2)

您可以使用它来匹配ID

来更新它们
UPDATE
    t
SET
    t.SomeNewColumn = other_table.SomeOldColumn,
FROM
    original_table t
INNER JOIN
     other_table copy
ON
    t.id = copy.id

或者如果你没有id,你可以通过使用ROW_NUMBER函数来枚举记录,但这是一个很长的镜头(我没有检查是否可能)。< / p>

答案 3 :(得分:0)

如果您正在更新,则需要一个主键才能加入。通常在这种情况下,其他人的回答就足够了。如果由于某种原因,您仍需要按特定顺序使用结果集更新表,则可以执行以下操作:

UPDATE t SET t.SomeNewColumn = copy.SomeOldColumn
FROM table t
    JOIN (SELECT ROW_NUMBER() OVER(ORDER BY id) AS row, id, SomeNewColumn FROM table) t2
        ON t2.Id = t.Id
    JOIN (SELECT ROW_NUMBER() OVER(ORDER BY id) AS row, SomeOldColumn FROM copytable) copy
        ON copy.row = t2.row

按照您想要的顺序获取新表及其行号,按所需顺序连接旧表及其行号,然后重新连接到新表,以便查询可以直接更新。