MySQL查询合并重复键(2张表)

时间:2018-11-02 00:03:43

标签: mysql

因为我的英语说得不好,所以请您谅解。

有两个表。
主键是时间

A
A time | A_temperature
1027   | 30
1028   | 30
1030   | 60

B  
B time | B_temperature
1027   | 40
1029   | 50
1030   | 20
1031   | 59

我想要以下结果。

time | A_temperature | B_temperature
1027 | 30            | 40
1028 | 30            | NULL
1029 | NULL          | 50
1030 | 60            | 20
1031 | NULL          | 59

因此,我进行了以下查询:

SELECT A.time, B.time, A_temperature, B_temperature
FROM A
JOIN B
    ON (B.time >= '1027' AND B.time <= '1031')
WHERE (A.time >= '1027' AND A.time <= '1031') 
GROUP BY A.time, B.time, A_temperature, B_temperature

执行上述查询后,A.timeB.time分开并输出结果。我想同时合并这些。如果时间为null,我们希望将其设置为非空时间。

1 个答案:

答案 0 :(得分:1)

您确实需要在此处进行完全外部联接。 MySQL不直接支持完整的外部联接运算符,但是我们可以使用左右联接的并集轻松地模拟一个。

SELECT COALESCE(A.time, B.time) AS time, A_temperature, B_temperature
FROM A
LEFT JOIN B ON A.time = B.time
UNION ALL
SELECT COALESCE(B.time, A.time), A_temperature, B_temperature
FROM A
RIGHT JOIN B ON A.time = B.time
WHERE A.time IS NULL
ORDER BY time;

enter image description here

Demo

请注意,我们从两个表的每一个中提取了时间的COALESCE。之所以行之有效,是因为可以确保两个表之一始终存在非NULL时间(否则,它甚至都不会成为联接查询的一部分)。但是,并非总是保证两个表都始终具有非NULL时间。