2013-10-24 40 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)