在单个SQL查询中查询相似但不相交的数据集

在单个SQL查询中查询相似但不相交的数据集,sql,mysql,sql-server,Sql,Mysql,Sql Server,在SQL中(特别是MySQL,但这个问题很一般),当我在不相交的时间范围内有多个表时,查询时间序列数据的最有效方法是什么?例如,如果我的表格如下所示: router1_20090330( unixtime integer unsigned, iface1_in integer unsigned, iface1_out integer unsigned ) router1_20090331( unixtime integer

在SQL中(特别是MySQL,但这个问题很一般),当我在不相交的时间范围内有多个表时,查询时间序列数据的最有效方法是什么?例如,如果我的表格如下所示:

router1_20090330( unixtime integer unsigned, 
                  iface1_in integer unsigned,
                  iface1_out integer unsigned )
router1_20090331( unixtime integer unsigned, 
                  iface1_in integer unsigned,
                  iface1_out integer unsigned )
以此类推,在interface1上使用(比如)1分钟的进出流量样本,每天提供86400条记录

我希望查询表示如下内容

SELECT CAST(unixtime/3600 as unsigned) AS hour, 
       sum(iface1_in), sum(iface1_out) 
  from router1_20090330 *then* router1_20090331
  group by hour order by hour;
i、 e.我希望两个表都能被查询和聚合,但要一个接一个,而不是被联接。

要合并两个(或更多)表:


注意,联合后的“ALL”告诉查询保留重复的行(如果两个表中出现相同的值-在您的场景中不太可能)。我通常使用UNION ALL,因为我认为它避免了测试重复行数据的开销。

UNION开销相当大,它本质上是一个连接columns@Khb当前位置工会不是这样的。它是附加行,而不是连接行。@Khb:对不起,这不准确。@Bill,当联合删除输出中的重复行时,您认为它是如何做到的?@Khb:方式类似于DISTINCT的工作方式。许多实现对临时结果进行排序,以便于消除重复项。这不是一个连接。
SELECT CAST(unixtime/3600 as unsigned) AS hour,
    SUM(iface1_in), SUM(iface1_out)
FROM (
    SELECT * FROM router1_20090330
    UNION ALL
    SELECT * FROM router1_20090331
) x
GROUP BY hour
ORDER BY hour