2013-10-24 51 views
1

实际表格大约有600万行,每行中的num1和num2表示数字边界。我需要将两列集合转换为单列,并将之应用于先前共享单行的两行中的每一行。下面是一个小样本。我看着Unpivot的例子,但似乎没有什么符合我的需要。任何人都可以推荐正确的方式去?我意识到我最终会得到1200万行。SQL Server 2012折叠/取消两个列合并成一个?

谢谢。

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 
+0

没有,这样做有没有其他的方法可以轻松完成。 –

回答

2

Unpivot接缝做你想做的。

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

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

+0

这样做,但我不得不在后面的语句中抛出一个Distinct关键字,以便在边缘案例中(不是在我的原始文章中)使用值7214,7214来摆脱模糊,因为我的Union暗中过滤掉了它们。谢谢。 – Snowy

0

如果你可以做一个两个步骤的过程,你可以这样做:

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

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

如果这不是一种选择,你可以从一个派生表,这将是由上述两种选择的工会选择做类似的事情。

+0

对不起,在我回答之前,我没有看到您的第二部分文字。 – KCevMart

+0

如果你愿意,你可以删除你的评论。 –

1

这可以使用跨应用

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