SQL - 将多列数据合并为一列
SQL - Combine data from several columns into one column
我正在创建复杂的 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 和 select
谢谢
AFAIK,除了使用 UNION
操作之外没有其他选择。 UNION
操作的基本目的是仅...组合来自多个 sources/result 集合的记录。所以你可以这样做
select Id1 from tbl1
union
select Id3 from tbl1
union
select Id2 from tbl1
你可以使用 UNPIVOT
SELECT Ids
FROM
(
SELECT Id1, Id2, Id3
FROM CTE
) d
UNPIVOT
(
Ids for id in (Id1, Id2, Id3)
) u
我最喜欢的方法是 cross apply
:
select v.id
from t cross apply
(values (t.id1), (t.id2), (t.id3)) v(id);
与使用 unpivot
的版本一样,它只读取 table 一次。使用 union all
的版本会扫描 table 三次。然而,cross apply
比 unpivot
更强大,并且需要更少的输入。
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
我正在创建复杂的 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 和 select
谢谢
AFAIK,除了使用 UNION
操作之外没有其他选择。 UNION
操作的基本目的是仅...组合来自多个 sources/result 集合的记录。所以你可以这样做
select Id1 from tbl1
union
select Id3 from tbl1
union
select Id2 from tbl1
你可以使用 UNPIVOT
SELECT Ids
FROM
(
SELECT Id1, Id2, Id3
FROM CTE
) d
UNPIVOT
(
Ids for id in (Id1, Id2, Id3)
) u
我最喜欢的方法是 cross apply
:
select v.id
from t cross apply
(values (t.id1), (t.id2), (t.id3)) v(id);
与使用 unpivot
的版本一样,它只读取 table 一次。使用 union all
的版本会扫描 table 三次。然而,cross apply
比 unpivot
更强大,并且需要更少的输入。
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