sql 语句,如何将数个相同表中的数据合并到一张表中

我有这样三张或者更多的表,格式为
table1
value time
a1 2012-7-31 01:00:00
a3 2012-7-31 03:00:00
a4 2012-7-31 04:00:00
a5 2012-7-31 05:00:00

table2
value time
b1 2012-7-31 01:00:00
b2 2012-7-31 02:00:00
b4 2012-7-31 04:00:00
b5 2012-7-31 05:00:00

table3
value time
c1 2012-7-31 01:00:00
c2 2012-7-31 02:00:00
c3 2012-7-31 03:00:00
c5 2012-7-31 05:00:00

我要怎么写sql语句能得到如下结果?
value1 value2 value3 time
a1 b1 c1 2012-7-31 01:00:00
NULL b2 c2 2012-7-31 02:00:00
a3 NULL c3 2012-7-31 03:00:00
a4 b4 NULL 2012-7-31 04:00:00
a5 b5 c5 2012-7-31 05:00:00

是用full join再合并吗???

这个问题首先必须基于table1,table2,table3这3张表各自的time字段无重复值,否则每个有重复的时间,都可能会组合成N多种组合(假如这3张表每一张都有两条时间为2012-07-31 01:00:00的记录,那么单单就“2012-07-31 01:00:00”这个时间就可以组合成2x2x2=8中组合,重复愈多出现的组合越多,大的重复记录,因互相乘积的原因,很容易会导致出现天文数字种组合。它一方面会导致效率低下,另一方面还会出现在这些组合中到底取舍那条记录的问题,有时候单凭SQL是很难解决。因此如要实现楼主的要求,应确保各自表中无重复时间记录,否则合并结果将难令人满意,楼主可以测试各种情况和代码以证实的本人说法。

先用UNION操作符求出3张表唯一的时间列表,该子查询表取别名t,然后分别用 t 与其它3张表基于time字段进行left join,最后求出最终结果集。
为了便于理解该SQL语句,我对那3张表未使用表别名,代码字符数看起来会比较多。

select table1.[value] as value1,table2.[value] as value2,table3.[value] as value3,t.[time] from
(((select [time] from table1 union select [time] from table2 union select [time] from table3) t
left join table1 on
t.[time]=table1.[time])
left join table2 on
t.[time]=table2.[time])
left join table3 on
t.[time]=table3.[time]
order by t.[time]

注:基于单独表内无重复时间记录。代码已测试通过,如果楼主有超过3张以上相同的表,照套上面写法即可,
如果4张以上的表相关SQL代码不知如何写,可以向我发追问。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-07-31
楼上的回答有点问题,time会有重复的情况
我的解决方案是先求出时间表 tt,然后用tt和其他表外连接。

select t1.value value1, t2.value value2, t3.value value3, tt.time from (
select distinct nvl(nvl(t1.time,t2.time),t3.time) time
from table1 t1 full join table2 t2 on t1.time=t2.time full join table3 t3 on t1.time=t3.time) tt
full join table1 t1 on tt.time = t1.time full join table2 t2 on tt.time=t2.time full join table3 t3 on tt.time = t3.time
第2个回答  2012-08-01
select t1.value,t2.value,t3.value,timeTab.time from (select time from t1
UNION
select time from t2
UNION
select time from t3) timeTab
LEFT JOIN t1 ON timeTab.time=t1.time
LEFT JOIN t2 ON timeTab.time=t2.time
LEFT JOIN t3 ON timeTab.time=t3.time
order by timeTab.time
第3个回答  2012-07-31
insert into TargetTable
select * from table1
union
select * from table2
union
......
第4个回答  2012-07-31
select a.[value] as value1,b.[value] as value2, c.[value] as value3,
isnull(isnull(a.time,b.time),c.time) as time
from table1 a full join table2 b on a.time = b.time
full join table3 c on a.time = c.time追问

谢谢回答,不过有点问题,结果里面会有两条time为 2012-7-31 02:00:00 的值:

NULL b2 NULL
NULL NULL c2
这两条没有合并起来,还有就是如果有3个以上这样的表,该怎么写啊,谢谢!

追答

那检查一下time的数据类型是什么呢?
如果两条,说明table2里的和table3里的这个值是不相等的

如果有更多表的话,from。。。 这里,就是加full join 就可以了
但是select 里的 time列值选取,要注意一下
不过也简单,就是套 isnull ,比如多一个table4

select a.[value] as value1,b.[value] as value2, c.[value] as value3,d.[value] as value4,
isnull(isnull(isnull(a.time,b.time),c.time),d.time) as time
from table1 a full join table2 b on a.time = b.time
full join table3 c on a.time = c.time
full join table4 d on a.time = d.time

sql 语句,如何将数个相同表中的数据合并到一张表中
select nvl(t1.val,'null')value1,nvl(t2.val,'null')value2,nvl(t3.val,'null')value3,tt.tm from (select distinct tm from (select tm from table1 union select tm from table2 union select tm from table3))tt,table1 t1,table2 t2,table3 t3 where tt.tm=t1.tm(+)and tt...

请教sql200数据库 3个表合并成为一个表语句
使用以下SQL语句便可完成三个表合并为一个表的操作:注意,将Table1-3替换为你的表名。具体语句如下:SELECT [Table3].[mname], [Temp1].[no], [Temp2].[rmb] FROM [Table3]INNER JOIN (SELECT [id], SUM([no]) AS [NO] FROM [Table1] GROUP BY [id]) AS [Temp1] ON [Table3]...

sql多表格式相同汇总到一张表的语句
UNION ALL的用途是将几个成绩表合并成为一个表A。然后按照A表的学号和姓名字段进行分组合计。有不明白的再问我

sql如何将两个table的字段怎么合并到一张表?
在SQL中,合并两个表的字段到一张表,前提是这两个表之间存在一对一、多对一或一对多的关系。此操作通常使用JOIN语句来实现。假设有一个学生表A,以及一个保存学生成绩的表B。表A和表B分别包含了学生信息,要将这两表的数据合并,可以使用JOIN操作。确保A表和B表数据量相同,即对于A表中的每个学生...

SQL 两张表合并 (两张表的列都相同)
可以参考下面的方法:1、第一种,用一张临时表,把所有数据都放在一张表里 INSERT INTO QunList SELECT * FROM QunList89,90,91,92;再在QunList中查询 2、第二种,用 UNION ALL方式查询 SELECT * FROM QunList89 UNION ALL SELECT * FROM QunList90;...

...如何用存储过程把多个表的数据添加到一张表中,表字段都很相近,我用...
然后字段是哪些 如果表名不变 字段类似的话 我帮你写个模型 create proc usp_tableall as insert into 表名 --这里表要存在 存储你处理的数据 否则就用select * into from tb 的格式 select col1,col2 from a union all select col1,col2 from b ……go exec usp_tableall ...

SQL中,如何将三个表中同一字段中的内容汇总到一个字段中?
集合查询,字段的数据类型要一致。并操作是将结果竖着合并。select 字段 from A UNION ALL select 字段 from B UNION ALL select 字段 from C 当然查询还可以是多个字段,还可加WHERE条件。加ALL是把重复的字段也留下,不想重复就去掉ALL。

在SQL中怎样将多张表的数据插入一张表中
如果列名都1致的话可以先把多张表的结果用unionall连起来以后作为1个表插入目标表中

SQL中如何合并多个数据表中的字段(列)
在实际应用中,UNION和UNION ALL可以合并两个数据表中的相同类型字段,形成单一列。例如,客户表中存储了客户信息,供货商表中存储了供货商的地址信息。通过以下SQL语句可以找出客户和供货商分布的所有城市:而采用UNION ALL的SQL语句则会将结果中的重复城市出现两次,如广州和南京。为了实践这一概念,我们...

sql server 语句如何将3个表合并成一个表?
先说一下我的思路:首选你把表1,表2,表3中的数据都合并在一起表中,使用union all合并在一起。先不要管姓名是否会重复。但是在执行合并的时候,需要对每一个待合并的数据,打上一个标签,代表这个是哪个表中来的数据,这个标签最后用于区分同一个人的不同的成绩是分别是多少,不能因为合并在一...

相似回答