以不同模式从现有表创建表?

时间:2014-05-28 16:35:01

标签: sql sql-server database union

我正在使用SQL Server。我的数据库中有一个表,就像

id    stops    time1    time2    time3    time4
-----------------------------------------------
1    Exit1    6:00 AM  8:00 AM  10:00 AM  12:00 PM
2    Exit2    7:00 AM  9:00 AM  11:00 AM  1:00 PM 

上面有更多行。

但是我想创建另一个表,它只使用那些id并将时间#放在单独的列中,对应各自的id,如下所示:

id    times
------------
1    6:00 AM
1    8:00 AM
1    10:00 AM
1    12:00 PM
2    7:00 AM
2    9:00 AM

任何人都可以请我先行一步吗?甚至一个解决方案将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

您可以运行四个单独的查询来获得所需的结果(SQL Fiddle):

INSERT INTO MyTable
(id, times)
SELECT id, time1
FROM MyOtherTable

INSERT INTO MyTable
(id, times)
SELECT id, time2
FROM MyOtherTable

INSERT INTO MyTable
(id, times)
SELECT id, time3
FROM MyOtherTable

INSERT INTO MyTable
(id, times)
SELECT id, time4
FROM MyOtherTable

或者,您可以执行以下操作,以防止插入重复项(SQL Fiddle):

INSERT INTO MyTable
(id, times)
SELECT id, time1
FROM MyOtherTable
UNION 
SELECT id, time2
FROM MyOtherTable
UNION
SELECT id, time3
FROM MyOtherTable
UNION
SELECT id, time4
FROM MyOtherTable

答案 1 :(得分:1)

UNPIVOT的定义。如果您使用的是SQLServer 2005或更高版本,则可以使用

INSERT INTO OtherTable
SELECT id, [time]
FROM   (SELECT id, time1, time2, time3, time4 FROM Table1) t
       UNPIVOT
       ([time] FOR times IN (time1, time2, time3, time4)) pvt

SQLFiddle demo

UNPIVOT要求所有未公开的列具有相同的类型和维度