我制作了这样的现有表的副本:
select * into table_copy from table
从那时起,我对表进行了一些架构更改(添加/删除了列,更改了列的顺序等)。现在我需要运行一个更新语句来填充我添加的新列,如下所示:
update t
set t.SomeNewColumn = copy.SomeOldColumn
from t
但是,如何根据行索引而不是某些列值匹配来获取第二个表?
注意:两个表的原始位置仍然具有相同的行数。
答案 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
按照您想要的顺序获取新表及其行号,按所需顺序连接旧表及其行号,然后重新连接到新表,以便查询可以直接更新。