SQL连接3个格式相同的表

SQL连接3个格式相同的表,sql,join,Sql,Join,需要帮助获取每个日期的总Val! 我目前有3个表,每个表以相同的格式存储相同类型的数据 我需要在一张桌子上找到每个日期的Val CREATE TABLE table1(Date DATE, Val INTEGER); CREATE TABLE table2(Date DATE, Val INTEGER); CREATE TABLE table3(Date DATE, Val INTEGER); INSERT INTO table1 values('2013-01-01', 4); INSERT

需要帮助获取每个日期的总Val! 我目前有3个表,每个表以相同的格式存储相同类型的数据

我需要在一张桌子上找到每个日期的Val

CREATE TABLE table1(Date DATE, Val INTEGER);
CREATE TABLE table2(Date DATE, Val INTEGER);
CREATE TABLE table3(Date DATE, Val INTEGER);

INSERT INTO table1 values('2013-01-01', 4);
INSERT INTO table1 values('2013-01-02', 3);
INSERT INTO table1 values('2013-01-04', 2);

INSERT INTO table2 values('2013-01-01', 5);
INSERT INTO table2 values('2013-01-03', 4);
INSERT INTO table2 values('2013-01-04', 1);

INSERT INTO table3 values('2013-01-02', 3);
INSERT INTO table3 values('2013-01-03', 1);
INSERT INTO table3 values('2013-01-06', 8);
我试过:

SELECT table1.Date, table2.Date, table3.Date, ISNULL(table1.Val,0) + ISNULL(table2.Val,0) + ISNULL(table3.Val,0) 
FROM table1
FULL JOIN table2 
ON table1.Date = table2.Date
FULL JOIN table3
ON table1.Date = table3.Date

谢谢

您可以
将每个表中的所有值合并为一个派生表,然后从该表中
求和(Val)
分组:

SELECT Date, SUM(Val)
FROM (SELECT * FROM table1
      UNION ALL 
      SELECT * FROM table2
      UNION ALL 
      SELECT * FROM table3) v
GROUP BY Date
输出

Date        SUM(Val)
2013-01-01  9
2013-01-02  6
2013-01-03  5
2013-01-04  3
2013-01-06  8

在这种情况下可以使用合并。我创建了一个名为newtable的新表,将数据合并到该表中,保留原始表不变。我将列名称Date更改为Dait

select * into newtable
from table1

merge newtable t1
using table2 t2
on t1.Dait = t2.Dait
when matched
then update set
t1.Val = t1.Val + t2.Val
when not matched
then insert (Dait, Val)
values(t2.Dait, t2.Val);

merge newtable t1
using table3 t3
on t1.Dait = t3.Dait
when matched
then update set
t1.Val = t1.Val + t3.Val
when not matched
then insert (Dait, Val)
values(t3.Dait, t3.Val);

如果您的表没有重复的日期,则完全联接应该可以工作:

SELECT COALESCE(table1.Date, table2.Date, table3.Date) as date, 
       COALESCE(table1.Val, 0) + COALESCE(table2.Val, 0) + COALESCE(table3.Val, 0) 
FROM table1 FULL JOIN
     table2 
     ON table1.Date = table2.Date FULL JOIN
     table3
     ON table1.Date = table3.Date;
在许多数据库中,您可以使用
USING
子句稍微简化这一点:

SELECT date, 
       COALESCE(table1.Val, 0) + COALESCE(table2.Val, 0) + COALESCE(table3.Val, 0) 
FROM table1 FULL JOIN
     table2 
     USING (Date)
     table3
     USING (Date);
通常,
完全联接
的性能要比
联合所有
/
分组方式
好。我确实发现后者更简单一些,因为您不必担心
NULL