SELECT INTO能否向已有表插入数据?关联表字段更新异常求助
问题解答
1. SELECT INTO能否向已存在的表插入数据?
直接给结论:不行。SELECT INTO的核心作用是创建一个全新的表,再把查询结果插入到这个新表里。如果目标表已经存在,执行这条语句会直接报错。要是你想往已存在的表插入新行,得用INSERT INTO ... SELECT ...的组合,但这仅适用于新增记录的场景——显然你现在的需求不是加新行,而是更新已有数据,所以这条语法完全不对路。
2. 你的场景正确解决方案
你之前用INSERT INTO ... SELECT ...得到新增行,完全是意料之中的事,因为INSERT的本职工作就是添加新记录,它根本不会去碰已有的行。要更新test表中匹配LoadID的comment字段,得用UPDATE结合表关联的写法:
基础更新(单条匹配数据)
如果temp表中每个LoadID只对应一条comments记录,用这条语句就够了:
UPDATE t SET t.comment = temp.comments FROM [test] t INNER JOIN temp ON t.LoadID = temp.LoadID WHERE t.LoadID IS NOT NULL;
这里给test表起了别名t,通过INNER JOIN和temp表的LoadID做匹配,直接把temp的comments赋值给test的comment字段,只会更新匹配到的现有行,不会新增。
多匹配数据拼接(符合你的期望结果)
看你期望的结果是把多个comments拼起来(比如abc,abcdef,abcdefg),说明temp表中同一个LoadID对应多条记录。这时候需要用聚合函数把这些comments拼接起来,以SQL Server为例,可以用STRING_AGG函数:
UPDATE t SET t.comment = STRING_AGG(temp.comments, ',') FROM [test] t INNER JOIN temp ON t.LoadID = temp.LoadID WHERE t.LoadID IS NOT NULL GROUP BY t.LoadID, t.name, t.comment;
这条语句会把同一个LoadID对应的所有comments用逗号连接起来,更新到test表的comment字段里,正好满足你的需求。
内容的提问来源于stack exchange,提问作者Mobeen Tahir Latif
相关产品推荐
相关产品推荐

