MySQL-具有共享密钥的表



我有两个表,看起来像这样:

表A

time_unix   time_msecs   measurementA
1000        329          3.14159
1000        791          9.32821
1001        227          138.3819
1001        599          -15.3289

表B

time_unix   time_msecs   measurementB
1000        565          17.2938
1000        791          12348.132
1001        227          -128.3283
1001        293          225.12938

对于这两个表,我都使用了一个复合键(由time_unix和time_msecs组成(。这些测量数据(measurementA和measurementB(在两个不同的表中,因为实际上有很多很多列(成千上万(——太多了,无法保存在一个表中。

我想执行一个查询,这样结果集就是我的键和从这两个表中选择的几列。有时时间(键(排成一行,有时则不然。如果没有,我只希望为该列返回一个null值。

期望结果

time_unix   time_msecs   measurementA    measurementB
1000        329          3.14159         (null)
1000        565          (null)          17.2938
1000        791          9.32821         12348.132
1001        227          138.3819        -128.3283
1001        293          (null)          225.12938
1001        599          -15.3289        (null)

如何做到这一点?我不认为JOIN是可行的。我一直在Javascript中组合数据集,这看起来非常麻烦。必须有一种方法在数据库端做到这一点。

您想要两个表之间的完全外部联接:

SELECT a.time_unix,
a.time_msecs,
a.measurementA,
b.measurementB
FROM TableA a
LEFT JOIN TableB b
ON a.time_unix = b.time_unix AND
a.time_msecs = b.time_msecs
UNION ALL
SELECT b.time_unix,
b.time_msecs,
a.measurementA,
b.measurementB
FROM TableA a
RIGHT JOIN TableB b
ON a.time_unix = b.time_unix AND
a.time_msecs = b.time_msecs
WHERE a.time_unix IS NULL
ORDER BY 1, 2;

我使用了union,因为MySQL中没有full joins

select TableA.time_unix
,TableA.time_msecs
,TableA.measurementA
,TableB.measurementB
from TableA
left join TableB on TableA.time_msecs = TableB.time_msecs and
TableA.time_unix  = TableB.time_unix
union
select TableB.time_unix
,TableB.time_msecs
,TableA.measurementA
,TableB.measurementB 
FROM TableA
right join TableB on TableA.time_msecs = TableB.time_msecs and
TableA.time_unix  = TableB.time_unix
order by time_unix
<12348.1>空[/tr><15.3289>
time_unixtime_msecs测量A测量B
10003293.14159
10007919.32821
100056517.2938
1001227138.382-128.328
1001599
1001293252.129

最新更新