实际表有大约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
答案 0 :(得分:2)
Unpivot接缝可以做你想做的事。
select u.allnum,
u.metakey
from @orig as o
unpivot (allnum for col in (o.num1, o.num2)) as u
与联合查询相比,你已经拥有它应该更快,因为它只会扫描一次而不是两次。
答案 1 :(得分:1)
使用交叉申请
可以轻松完成select allnum,metakey from @orig cross apply (values(num1 ), (num2)) x(allnum)
答案 2 :(得分:0)
如果您可以执行两个步骤,则可以执行此操作:
insert @dest (bigint, metakey)
select num1, metakey from @orig
insert @dest (bigint, metakey)
select num2, metakey from @orig
如果这不是一个选项,你可以通过从派生表中选择来做类似的事情,派生表将由上面两个选择的联合组成。