【问题标题】:SQL Server 2012 Collapse / Unpivot Two Columns Into One?SQL Server 2012 折叠/取消将两列合二为一?
【发布时间】:2013-10-24 00:47:24
【问题描述】:

实际表大约有600万行,每行的num1和num2代表数字边界。我需要将两列集转换为单列,并将 应用于先前共享单行的两行中的每一行。下面是一个小样本。我查看了 Unpivot 示例,但似乎没有什么适合我需要的。任何人都可以推荐正确的方法吗?我意识到我最终会得到 1200 万行。

谢谢。

declare @orig table ( num1 bigint , num2 bigint , metakey tinyint )
insert into @orig 
select 7216,7471  , 0
union all
select 7472,8239  , 1
union all
select 8240,9263  , 2
union all
select 9264,11311 , 3


declare @dest table ( allnum bigint , metakey tinyint )

    -- Wanted result set:
/*
    select * from @dest
    7216        0
    7471        0
    7472        1
    8239        1
    8240        2
    9263        2
    9264        3
    11311       3
*/

我知道这适用于我的表变量样本,但对于非常大的集合,它闻起来不太对:

insert into @dest
select num1 , metakey
from @orig
union all 
select num2 , metakey
from @orig
order by 1

【问题讨论】:

  • 不,没有其他方法可以做到这一点。

标签: sql-server pivot unpivot cartesian-product


【解决方案1】:

Unpivot 接缝做你想做的事。

select u.allnum,
       u.metakey
from @orig as o
  unpivot (allnum for col in (o.num1, o.num2)) as u

与您已经拥有的联合查询相比,这应该更快,因为它只会扫描表一次而不是两次。

【讨论】:

  • 做到了,但我确实必须在后面的语句中添加一个 Distinct 关键字,以摆脱值为 7214,7214 的边缘情况(不在我的原始帖子中)中的欺骗,如我的联盟隐含地将它们过滤掉了。谢谢。
【解决方案2】:

这可以使用交叉应用轻松完成

select allnum,metakey from @orig cross apply (values(num1 ), (num2)) x(allnum)

【讨论】:

    【解决方案3】:

    如果您可以执行两步流程,您可以这样做:

    insert @dest (bigint, metakey)
        select num1, metakey from @orig
    
    insert @dest (bigint, metakey)
        select num2, metakey from @orig
    

    如果这不是一个选项,您可以通过从派生表中进行选择来执行类似的操作,该派生表将由上述两个选择的联合组成。

    【讨论】:

    • 抱歉,在我回答之前我没有看到你的第二段文字。
    • 如果您愿意,可以删除您的评论。
    猜你喜欢
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2014-10-02
    • 2021-03-22
    • 2016-12-29
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多