2012-04-17 56 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