SQL - 将来自多个列的数据合并为一列

时间:2017-03-20 10:02:19

标签: sql sql-server tsql union-all

我正在创建复杂的CTE查询。在MSSQL中 哪个结果会是那样的

| Id1 | Id2 | Id3 |
|  1  |  2  |  3  |
|  5  |  4  |  1  |
|  6  |  5  |  2  |

现在我需要将所有数据合并到类似

的列上
| Ids |
|  1  |
|  2  |
|  3  |
|  5  |
|  4  |
|  1  |
|  6  |
|  5  |
|  2  |

我想尝试避免 union all 并按每列选择 感谢

4 个答案:

答案 0 :(得分:3)

我最喜欢的方法是使用cross apply

select v.id
from t cross apply
     (values (t.id1), (t.id2), (t.id3)) v(id); 

与使用unpivot的版本一样,这只会读取一次表格。使用union all的版本将扫描表三次。但是,cross applyunpivot更强大,并且需要更少的输入。

答案 1 :(得分:1)

AFAIK,除了使用UNION操作之外,没有其他选择。 UNION操作的基本目的是仅...组合来自多个源/结果集的记录。所以你可以这样做

select Id1 from tbl1
union
select Id3 from tbl1
union
select Id2 from tbl1

答案 2 :(得分:1)

您可以使用UNPIVOT

SELECT Ids
FROM
(
    SELECT Id1, Id2, Id3
    FROM CTE
) d
UNPIVOT 
(
    Ids for id in (Id1, Id2, Id3) 
) u

答案 3 :(得分:0)

Use UNPIVOT table to get your result :

CREATE TABLE #table( Id1 INT ,Id2 INT , Id3 INT )
INSERT INTO #table(  Id1 ,Id2 , Id3 ) 
SELECT 1 ,  2 ,  3 UNION ALL
SELECT 5 ,  4 ,  1 UNION ALL
SELECT 6 ,  5 ,  2 

SELECT _Result [Result]
FROM 
(
  SELECT Id1 ,Id2 , Id3
  FROM #table
)A
UNPIVOT
 (
  _Result FOR Id IN (Id1 , Id2 , Id3)
 ) UNPvt