如何在SQL中附加表“Sideways”

时间:2012-04-17 10:27:43

标签: sql sql-server tsql sql-server-2008-r2

我所拥有的是大约15个表,每个表有大约10列和近100万行数据。

所有15个表都有相同的主键我可以用来加入它们。

例如..
表1 - A B C D E列 表2 - A B F G H列 表3 - 列A B I J K
表4 - 列A B L M N
等等.A& B是主键

我需要的是一张看起来像这样的大桌子。
mainTable - 列A B C D E F G ... M N

现在,我所做的是:
- 从表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)

这似乎有效,只是它非常低效。加入一张桌子需要很长时间..

是否有替代/更快的方法来执行此任务?

3 个答案:

答案 0 :(得分: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子句将数据从表数据“移动”到表main:     INSERT INTo main     SELECT A,B,Max(C),Max(D),Max(E),Max(F)...... Max(N)     来自数据     GROUP BY A,B

现在这可能是资源耗费但可能仍然比更新执行得更快。其背后的想法是加快数据收集过程,然后当所有数据都在一个地方时,将数据正确地移动到一起。由于其他列默认为空白(或一个空格),因此Max函数将从实际导入的任何列中获取数据。

答案 1 :(得分:0)

更新通常比插入慢。而是创建一个新表并将所有数据插入其中。

答案 2 :(得分: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