我有两个表,看起来像这样:
表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
time_unix | time_msecs | 测量A | 测量B |
---|---|---|---|
1000 | 329 | 3.14159 | 空 |
1000 | 791 | 9.32821 | <12348.1>|
1000 | 565 | 空17.2938 | [/tr>|
1001 | 227 | 138.382 | -128.328 |
1001 | 599 | <15.3289>空 | |
1001 | 293 | 空 | 252.129 |