我有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是相同的只有计数器与文件不同提交。
我的方法是将计数器组合在一个表中,就像它们在系统中一样。
答案 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了解如何更新