sql - 在另一个表 SQL Server 2008 中使用来自 SELECT 的 UPDATE 语句覆盖 ID 值

标签 sql sql-server-2008 sql-update

我有两个表,其中恰好有 20 行。我想用 Table1 中的 ID 值覆盖 Table2 的 ID 值,以便我可以使用 JOIN 查询进行测试。我将如何覆盖这些值?

我找到了指导如何使用 SELECT 语句进行更新的帖子,但是它需要将数据连接到列上,在我的例子中没有列匹配。

UPDATE Table2
SET Table2.ID = Table1.ID
FROM Table1

上面的查询用表 1 中第一个 ID 列的值覆盖了 Table2 中的所有 ID 列。

最佳答案

为了好玩(是的,周五晚上我有一种扭曲的幽默感!),这是一个可以做到这一点的查询! - 我已经声明了表和顶部,并且每个表中只使用了 6 行,但是你会明白的:

--Setup test data
declare @table1 table (ID int, Name varchar(10))
declare @table2 table (ID int, Name varchar(10))

insert @table1
    select ID = 1, Name = 'Item1'
    union select ID = 2, Name = 'Item2'
    union select ID = 3, Name = 'Item3'
    union select ID = 4, Name = 'Item4'
    union select ID = 5, Name = 'Item5'
    union select ID = 6, Name = 'Item6'

insert @table2
    select ID = 11, Name = 'Item11'
    union select ID = 12, Name = 'Item12'
    union select ID = 13, Name = 'Item13'
    union select ID = 14, Name = 'Item14'
    union select ID = 15, Name = 'Item15'
    union select ID = 16, Name = 'Item16'


--Do the update
update t1
    set 
        ID = t2.ID
from
    @table1 t1 --Assign a row number to each row of table 1
    cross apply (select rownum = COUNT(1) from @table1 sub where sub.ID <= t1.ID) x1,
    @table2 t2 --Assign a row number to each row of table 2
    cross apply (select rownum = COUNT(1) from @table2 sub where sub.ID <= t2.ID) x2
where x1.rownum = x2.rownum --Match the row numbers

更新:

基于@sllev 建议的替代更新命令:

update t1
    set 
        ID = t2.ID
from
    (select id, rownum  = ROW_NUMBER() OVER(order by ID) from @table1) t1
    join (select id, rownum  = ROW_NUMBER() over (order by id) from @table2) t2
        on t1.rownum = t2.rownum

关于sql - 在另一个表 SQL Server 2008 中使用来自 SELECT 的 UPDATE 语句覆盖 ID 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7046135/

相关文章:

oracle - 加快 Oracle DB 大量记录的更新速度

php - 如果列不唯一,如何更新重复键?

sql - 如何插入包含撇号(单引号)的值?

mysql - 在 mySQL 中创建表的语法错误

python - 加入 sqlalchemy 的混合属性

sql - 是否可以在 Postgres 中仅在 2 列之一发生冲突时插入?

sql-server-2008 - 从 SQL Server 2008 中的所有数据库中获取所有存储过程

java - Hibernate ConstraintViolationException : could not insert, SQL 错误

mysql - 显示经理通过商店程序批准文件

sql - GROUP BY 组合/连接列