要从表的某些列复制到另一个表中的一列的SQL查询

时间:2015-02-23 03:30:36

标签: mysql sql-server

我有这个场景

表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中完成它。

4 个答案:

答案 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;

SQL小提琴:http://sqlfiddle.com/#!3/9ea669

答案 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