如何将临时表的单列数据插入到主表的多列中?
解决临时表单列多行数据插入主表多列的问题
我来帮你搞定这个需求——把临时表的单列6行数据,对应插入到主表t_Act的6个列中。核心思路是先给临时表的每行数据标记行号,再通过行转列的方式把单列数据转换成一行多列,最后插入主表。
步骤1:给临时表添加行号
首先我们需要给临时表的每条数据加上行号,这样才能精准对应主表的各个列。假设你的临时表名为#temp,执行以下SQL:
-- 创建带行号的临时表,行号对应主表的列顺序 SELECT col, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS row_num INTO #temp_with_row_num FROM #temp; -- 替换成你的实际临时表名称
注意:
ORDER BY (SELECT NULL)是因为临时表没有天然的排序字段,如果你的临时表数据顺序是固定的,这个写法没问题;如果有明确的排序依据(比如插入顺序的标识列),可以把(SELECT NULL)替换成对应的列,确保行号和主表列的对应关系完全正确。
步骤2:行转列并插入主表
接下来我们用条件聚合的方式把单列多行转成一行多列,然后插入主表:
-- 将转换后的数据插入主表t_Act INSERT INTO [dbo].[t_Act] ( EventType, ClientMsgID, SessionID, Protocol, MessageType, SequenceNumber ) SELECT MAX(CASE WHEN row_num = 1 THEN col END) AS EventType, MAX(CASE WHEN row_num = 2 THEN col END) AS ClientMsgID, MAX(CASE WHEN row_num = 3 THEN col END) AS SessionID, MAX(CASE WHEN row_num = 4 THEN col END) AS Protocol, MAX(CASE WHEN row_num = 5 THEN col END) AS MessageType, MAX(CASE WHEN row_num = 6 THEN col END) AS SequenceNumber FROM #temp_with_row_num;
如果你习惯用PIVOT语法,也可以这样写:
INSERT INTO [dbo].[t_Act] ( EventType, ClientMsgID, SessionID, Protocol, MessageType, SequenceNumber ) SELECT [1], [2], [3], [4], [5], [6] FROM ( SELECT col, row_num FROM #temp_with_row_num ) AS source_data PIVOT ( MAX(col) FOR row_num IN ([1], [2], [3], [4], [5], [6]) ) AS pivot_table;
验证结果
执行完上面的SQL后,你可以查询主表确认数据是否正确插入:
SELECT * FROM [dbo].[t_Act];
应该会看到一行数据,各个列分别对应临时表的6行值:23041、ORF5674、FNRA、FIX_44、0、AE。
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

