sql server - 将表合并到一个表中

时间:2014-06-27 13:31:45

标签: sql-server

我有2张桌子,每张桌子都有'日期'时间'和' ID'列和大约100个额外的列代表计数器,我还有一个包含' Date'' Time'和' ID'列加上它具有在其他2个表中退出的所有计数器。

我需要一种方法来更新4个表中的主表,如下所示:

Table 1

Date,Time,ID,Counter_A,Counter_B

01012014,00:00:00,1,10,20

01012014,00:00:00,2,7,8

21012014,00:00:00,1,3,1


Table 2

Date,Time,ID,Counter_C,Counter_D

01012014,00:00:00,1,30,40

01012014,00:00:00,2,5,9

21012014,00:00:00,1,4,2`

Master Table

Date,Time,ID,Counter_A,Counter_B,Counter_C,Counter_D
01012014,00:00:00,1,10,20,30,40

01012014,00:00:00,2,7,8,5,9

21012014,00:00:00,1,3,1,4,2

我尝试使用INSERT动态Sql,但它花了太长时间,特别是我在表1和表2的每一行中都有大约100,000行,有时它还有超时到期错误。

顺便说一下,我将(表1和表2)的每日更新作为CSV文件,有没有办法更新Master表而不花费太多时间。

更多细节:

嗨,谢谢你的回答,

让我解释一下:我试图做的是存储系统的统计数据,统计数据是操作和操作成功和失败率等的计数器......

我每天获得每小时的统计数据,我将它们放入4个CSV文件中,我将这些数据收集到表格中,因此我每天都会获得4个新表格。

所以我得到每个计数器的每个ID 24值,我有来自所有文件的大约300个计数器。

主表包含所有300列,有时当我从系统导出CSV文件时,我忽略了一些计数器或添加了额外的计数器(列)。

系统中的数据是这样的: 日期时间ID ColA ColB .......... ColC ColD

但是从系统导出每个文件的导出列数(计数器)有限制,所以我必须将列分成4个文件,所以日期,时间和ID是相同的只有计数器与文件不同提交。

我的方法是将计数器组合在一个表中,就像它们在系统中一样。

2 个答案:

答案 0 :(得分:2)

您可以使用UNION ALL语句,它允许您将来自多个表的数据组合到单个数据集中  如果您有缺少的列(Counter_C,table1中的Counter_D),则用NULL或默认值(0,'',...)替换它们。
 如果您只想要唯一值(如果不应插入两个表中的相同值),则应使用UNION ALL而不是UNION

INSERT INTO MasterTable (Date,Time,ID,Counter_A,Counter_B,Counter_C,Counter_D) 
SELECT Date,Time,ID,Counter_A,Counter_B,NULL,NULL
FROM Table1
UNION ALL 
SELECT Date,Time,ID,NULL,NULL,Counter_C,Counter_D
FROM Table2
UNION ALL
...

如果要更新值,则必须列出列并包装unionized SELECT语句。

UPDATE M SET Date = X.Date, Time = X.Time, ID = X.ID, Counter_A = X.Counter_A, Counter_B = X.Counter_B, Counter_C = X.Counter_C, Counter_D = X.Counter_D) 
FROM MasterTable M, (    
SELECT Date,Time,ID,Counter_A,Counter_B,NULL,NULL
    FROM Table1
    UNION ALL 
    SELECT Date,Time,ID,NULL,NULL,Counter_C,Counter_D
    FROM Table2
    UNION ALL
    ...) AS X
WHERE M.ID = X.ID

答案 1 :(得分:0)

对不起,但我不明白你的问题......从我的角度来看," Master Table"看起来像T1和T2的连接...如果这是正确的,你可以创建一个视图,替换"主表"并按照this article了解如何更新