У меня есть этот сценарий
Таблица 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.
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
Когда нам нужно преобразовать данные столбцов в строки, это называется 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
.
Вам следует использовать SELECT INTO
. См. экземпляр .
Самый простой способ - использовать 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;
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными.