【问题标题】:SQL - Combine data from several columns into one columnSQL - 将多列的数据合并为一列
【发布时间】:2017-03-20 10:02:18
【问题描述】:

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

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

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

| ID | | 1 | | 2 | | 3 | | 5 | | 4 | | 1 | | 6 | | 5 | | 2 |

我想尽量避免联合所有并按每列选择
谢谢

【问题讨论】:

  • UNION ALL 有什么问题?我会去的......
  • 正如我所说,这个结果将来自复杂的 CTE 查询,我认为每列的 union all 将无效
  • 如果你喜欢或不喜欢最简单的方法是UNION ALL
  • 我知道,但如果有的话,我当然正在寻找不同的选择:)

标签: sql sql-server tsql union-all


【解决方案1】:

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

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

就像使用unpivot 的版本一样,它只读取表一次。使用union all 的版本将扫描表三次。但是,cross applyunpivot 强大得多,并且需要更少的输入。

【讨论】:

  • 这不是 ANSI 标准解决方案...而是特定于产品的
  • @Rahul 。 . .标准中支持横向连接。
【解决方案2】:

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

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

【讨论】:

  • 这个答案不正确。你明白为什么吗?
  • @GordonLinoff,不.. 启发我
  • @Rahul union 删除重复的结果。 union all 没有。
【解决方案3】:

你可以使用UNPIVOT

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

【讨论】:

    【解决方案4】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2012-05-27
      相关资源
      最近更新 更多