我有这个场景
表01
reportID | response1 | response2 | response3 | response4 | response5
1 | aaa | bbb | ccc | ddd | eee
2 | fff | ggg | hhh | iii | jjj
3 | lll | mmm | nnn | ooo | ppp
...
我想将此数据插入table 02
,结果应如下所示
id | reportID | response
1 | 1 | aaa
2 | 1 | bbb
3 | 1 | ccc
4 | 1 | ddd
5 | 1 | eee
6 | 2 | fff
7 | 2 | ggg
8 | 2 | hhh
9 | 2 | iii
10 | 2 | jjj
11 | 3 | lll
...
我怎样才能做到这一点,我试过了:
INSERT INTO table02 (reported, response)
SELECT reportid, reponse1 FROM table01
但它似乎不对。
Table 01
包含大约4k行,因此table 2
将包含大约20k行。
这里最好的方法是什么。
我可以创建一个控制台应用程序并从那里开始,但是我想从SQL Server Management Studio中完成它。
答案 0 :(得分:7)
最简单的方法是使用union all
:
insert into table02(reported, response)
select reportid, reponse1 from table01 union all
select reportid, reponse2 from table01 union all
select reportid, reponse3 from table01 union all
select reportid, reponse4 from table01 union all
select reportid, reponse5 from table01;
答案 1 :(得分:2)
为避免使用union all方法对表进行多次扫描,您还可以使用unpivot执行此操作:
SELECT
row_number() over (order by (select null)) as id,
reportID,
response
FROM
(
SELECT
reportID,
response1,
response2,
response3,
response4,
response5
FROM data) d
UNPIVOT
(response FOR respId IN
(response1, response2, response3, response4, response5)
)AS unpvt;
答案 2 :(得分:0)
您应该使用SELECT INTO
。请参阅 instance 。
答案 3 :(得分:0)
当我们需要将列数据转换为行时,它被称为 UnPivoting ,SQL Server为此提供了解决方案:
SELECT
row_number() over (order by (select null)) as id,
reportID,
response
FROM
(
SELECT
reportID,
response1,
response2,
response3,
response4,
response5
FROM data) d
UNPIVOT
(response FOR respId IN
(response1, response2, response3, response4, response5)
)AS unpvt;
使用此查询而不是Union All
。