2012-04-17 61 views
1

我所擁有的大概是15個表格,每個表格包含大約10列和近100萬行數據。如何在SQL中附加表格「Sideways」

所有的15個表都有相同的主鍵,我可以用它們來連接它們。

例如..
表1 - 列ABCDE
表2 - 列ABFGH
表3 - 列ABIJK
表4 - 列ABLMN
等。其中,A & B是主鍵

我需要的是一個巨大的表看起來像這樣..
mainTable - 列ABCDEFG ...... MN

現在,我所做的是:
- 從表1開始,作爲我的「主」表
- 更改表以添加所有列。 F G H .. L M N)
- 使用UPDATE命令填寫 「主」 表

update mainTable set 
F = a.F, 
G = a.G, 
H = a.H 
from mainTable left join Table2 a on 
mainTable.A = a.A and 
mainTable.B = a.B 

(rinse and repeat for each of the 15 tables) 

這似乎是工作,只是它的效率極其低下。它需要年齡才能加入一張桌子..

是否有替代/更快的方法來執行此任務?

+0

你爲什麼使用'LEFT JOIN'?如果它們對應的鍵不存在於Table2 *(和Table3等)*中,這將強制將值設爲NULL。那是對的嗎?另外,你是否確實知道'mainTable'中的每個鍵只在其他表中存在*(最多)*一次?下一步*(也部分回答最後一個問題)*,是否在所有表上都實施了索引和/或主鍵約束?確保快速加入?最後,是否有一個原因,你無法在一次更新中完成所有更新,主要是左側加入左側加入,左側加入等等等等。 – MatBailie 2012-04-17 10:33:47

+0

嗨Dems,我確信相應的鍵存在於所有表中,並且mainTable中的鍵是唯一的。主鍵約束不會在此表中強制執行,我不太清楚快速連接的含義。我可以在一次大規模的更新中完成所有工作,但是當我只用兩張表進行嘗試時,已經花了15-25分鐘完成更新..這就是爲什麼我在這裏尋找更有效的替代方案 – d0h 2012-04-17 10:44:21

+0

我的意思是如果沒有索引或主鍵約束,那麼在每個表上,聯接將非常緩慢。這類似於從書中撕下一百萬頁,並要求您將它們匹配到從另一本書中撕下的一百萬頁。如果他們被放入相同的訂單,這是一個微不足道的工作。如果他們是分散的(沒有索引或PK約束),那麼你會瘋了。 – MatBailie 2012-04-17 13:27:14

回答

0

更新通常比插入更慢。而是創建一個新表並將所有數據插入到該表中。

+0

如果有引用該表的外鍵約束會怎樣? – MatBailie 2012-04-17 10:42:25

+0

更改外鍵以引用新表。然後用視圖替換舊錶。 – 2012-04-17 11:43:03

+0

我試着創建一個表並插入,併發生主文件組最大大小問題。 (我正在使用sql server express)。無論如何,我最終做的只是選擇15個表中的所有字段,然後右鍵單擊>將結果另存爲>,然後導入到新創建的「主」表中,然後導入到新數據庫中。仍然輸入,我輸入這個,希望這次沒有錯誤! – d0h 2012-04-18 06:03:09

1

一種選擇,我能想到的:

CREATE TABLE data 
(
    A <some format> NOT NULL, 
    B <some format> NOT NULL, 
    C <some format> NOT NULL CONSTRAINT DF_data_C DEFAULT (' '), 
    D <some format> NOT NULL CONSTRAINT DF_data_D DEFAULT (' '), 
    ... 
    N <some format> NOT NULL CONSTRAINT DF_data_N DEFAUT (' ') 
) 

好了,現在你有所有必要的列的表。由於插入不會相互干擾,只需將所有導入數據插入到大表中即可。有一點需要檢查的是空間,因爲這個表格在數百萬行的末尾必然很大。

然後使用GROUP完成它的 「移動」 中的數據從表中的數據表主BY子句: INSERT INTO主 SELECT A,B,最大值(C),MAX(d),MAX(E),最大(F)...最大(N) 從數據 GROUP BY A,B

現在,這可能是資源管理器,但可能仍會比更新執行得更快。其背後的想法是加快數據收集過程,然後當所有數據都在一個地方正確地將數據一起移動。由於其他列默認爲空(或一個空格),Max函數將從實際導入的列中獲取數據。

+0

那裏有趣的想法..我會先嚐試安東尼的建議,因爲它需要更少的步驟。我使用UPDATE的原始方法似乎隨着每個表格的指數增長而變慢。 – d0h 2012-04-17 11:09:38

0

您可以只使用一個選擇到這樣的:

SELECT 
     T1.A, T1.B, T1.C, 
     T2.D, T2.E, T2.F, 
     T3.G, T3.H 
    INTO NewTable 
    FROM 
     T1 
     inner join T2 on T1.A = T2.A and T1.B = T2.B 
     inner join T3 on T1.A = T3.A and T1.B = T3.B 
      ORDE BY A,B -- If this will become your PK 

那麼你只需要改變表添加所需的指標:

ALTER TABLE NewTable ADD CONSTRAINT PK_NewTable PRIMARY KEY CLUSTERED (A,B) 

這將工作僅當所有表有相同的A,B組合。如果這種情況在不同的桌子上有所不同,你需要一個不同的解決方案:

SELECT 
     T1.A, T1.B, T1.C, 
     T2.D, T2.E, T2.F, 
     T3.G, T3.H 
    INTO NewTable 
    FROM 
    (SELECT DISTINCT A,B FROM 
    (SELECT A,B FROM T1 
     UNION SELECT A,B FROM T2 
     UNION SELECT A,B FROM T3) ALL) T0 
     inner join T1 on T0.A = T1.A and T0.B = T1.B 
     inner join T2 on T0.A = T2.A and T0.B = T2.B 
     inner join T3 on T0.A = T3.A and T0.B = T3.B