怎样优雅地用sql覆盖数据库表的一列?

表1有字段A,B,C
表2有字段D
表1 和表2 的行数相同
现在想用表2的D字段的内容去覆盖替代表1的C字段内容,假定这两个字段都是字符型的,怎样写sql最优雅?

阅读 5.1k
3 个回答
UPDATE table1
SET table1.C = table2.D
FROM table1, table2 
WHERE table1.id = table2.id

最基础的就行了,不然版本一更新,骚操作用不了了怎么办。

除了行数相同,两个表的行间没有任何关联关系,用D替换C的说法就不明确了。可以考虑强制给一个排序顺序row_number() over (order by)作为id进行替换。但是这样做的结果有什么意义只有题主自己把握了。

连新建表的权限也没有,可以先insert

insert into T1 select A, B, D + '<<INSERTED>>' C from
    (select row_number() over (order by A,B,C) id, * from T1) S1 
    inner join
    (select row_number() over (order by D) id, * from T2) S2
    on S1.id = S2.id

delete

delete T1 where C not like '%<<INSERTED>>'

当然最后还需要把Cupdate一下,去掉后缀<<INSERTED>>。

--如你所愿的优雅简洁

--你的目的是用 `表2` 的 D 列覆盖 `表1` 的 C 列

--我们换个思维,不用删除和覆盖那么复杂,直接查找出新的表显示 D 列、隐藏 C 列即可

--即达到优雅、而且简洁

SELECT [Table1].A,[Table1].B,[Table2].D FROM [Table1],[Table2] 

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题