1

实际表大约有 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
4

3 回答 3

2

Unpivot接缝做你想做的事。

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

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

于 2013-10-24T05:26:10.397 回答
1

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

select allnum,metakey from @orig cross apply (values(num1 ), (num2)) x(allnum)
于 2013-10-24T09:11:06.217 回答
0

如果您可以执行两步过程,则可以执行以下操作:

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

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

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

于 2013-10-24T01:01:31.420 回答