У меня есть этот сценарий

Таблица 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 содержит около 4 тыс. Строк, поэтому в table 2 будет около 20 тыс. Строк.

Какой здесь лучший подход.

Я мог бы создать консольное приложение и делать это оттуда, однако я хотел бы сделать это из SQL Server Management Studio.

1
KleberBH 23 Фев 2015 в 06:30

4 ответа

Лучший ответ

Чтобы избежать нескольких сканирований таблицы, которые происходят с подходом 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 Fiddle: http://sqlfiddle.com/#!3/9ea669

2
James Z 23 Фев 2015 в 03:44

Когда нам нужно преобразовать данные столбцов в строки, это называется 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.

0
shA.t 28 Апр 2015 в 04:49

Вам следует использовать SELECT INTO. См. экземпляр .

0
Rigel1121 23 Фев 2015 в 04:08

Самый простой способ - использовать 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;
7
Gordon Linoff 23 Фев 2015 в 03:32