2013-07-01 25 views
1

例如,我有第一個表格,我想用第一個表格填充第二個表格。使用SQL Server中的公用表表達式將表添加到另一個表中的表格

  Table A    
Name A B C D 
----------------------- 
name1 a1 b1 c1 d1 
name2 a2 b2 c2 d2 



     Table B (Desired Format)  
    ID Name Code 
---------------------- 
    1  name1 a1 
    2  name1 b1 
    3  name1 c1 
    4  name1 d1 
    5  name2 a2 
    6  name2 b2 
    7  name2 c2 
    8  name2 d2 

按@Surendra納特GM的建議,我想這

DECLARE @counter as int 
    SET @counter = 1; 
    ;WITH Actual AS 
    (
    SELECT ROW_NUMBER() OVER(ORDER BY IDKEY) as ID FROM Northwind.dbo.Table1 
    WHERE 
    ),FIRST AS 
    (
    SELECT ((ROW_NUMBER() OVER(ORDER BY IDKEY))*4-3) AS ID,Name, A 
    FROM Northwind.dbo.Table1 

    ),SECOND AS 
    (
    SELECT ((ROW_NUMBER() OVER(ORDER BY IDKEY))*4-2) AS ID, Name ,B 
    from Northwind.dbo.Table1 
    ), NEXT AS 
    (
SELECT ((ROW_NUMBER() OVER(ORDER BY IDKEY))*4-1) AS ID, Name, C 
    from Northwind.dbo.Table1next 
), ________ as 
(
    SELECT ((ROW_NUMBER() OVER(ORDER BY IDKEY))*4) AS ID, Name, D 
from Northwind.dbo.Table1 
) 

@counter = @counter+1; 
) 
    SELECT * FROM FIRST 
    UNION ALL 
    SELECT * FROM SECOND 
    UNION ALL 
    SELECT * FROM NEXT 
    UNION ALL 
    SELECT * FROM _________ 
    ORDER BY ID 

這裏,有什麼事我的 「第二作」 後使用。我試着編寫「THIRD AS」,但顯然沒有這樣的命令存在,所以經過一番搜索後,我可以使用「NEXT AS」編寫第三行,但我完全無法知道如何插入第四行。

我知道可以簡單地寫4個insert命令爲每個A,B,C和d的但我會得到這是不希望以下列順序的不代碼:

Table B(NOT DESIRED IN THIS FORMAT)  
    ID Name Code 
---------------------- 
    1  name1 a1 
    2  name2 a2 
    3  name1 b1 
    4  name2 b2 
    5  name1 c1 
    6  name2 c2 
    7  name1 d1 
    8  name2 d2 

此外,所需的格式可以使用簡單的循環來實現,但是在我正在處理的項目中,大約有200000行,簡單循環方法需要大量時間。所以,我想用CTE來做。請幫忙。

回答

1

​​可能是最快的(表現最佳的)的方式來做到這一點:

insert into b(id, name, code) 
    select row_number() over (order by (select NULL)) as id, name, code 
    from t 
    unpivot (code for col in (A, B, C, D)) unpvt; 

此使用row_number()計算id。我建議您在定義表格時將此列設置爲identity列。

編輯:

這並不能保證id號碼是正確的順序。如果他們的順序正確,那是巧合。您可以通過使用在選擇和訂購合適的order by條款由得到你想要的任何命令:

insert into b(id, name, code) 
    select row_number() over (order by (select name, col)) as id, name, code 
    from t 
    unpivot (code for col in (A, B, C, D)) unpvt; 

你可能會對每一行的另一個關鍵,除了名稱之外,比名字更好。這也按字母順序排列。

+0

感謝您的回答!不知道未轉義方法 – ni9e

+0

有趣,但這如何保證ID號碼的排序? – Andomar

1
insert TableB 
     (ID, Name, Code) 
select row_number() over (order by Name, Code) 
,  Name 
,  Code 
from (
     select Name 
     ,  A as Code 
     from TableA 
     union all 
     select Name 
     ,  B 
     from TableA 
     union all 
     select Name 
     ,  C 
     from TableA 
     union all 
     select Name 
     ,  D 
     from TableA 
     ) SubQueryAlias 
相關問題