问题描述
我有两个表格,其中包含来自两个测量设备的测量数据(表格结构由数据采集软件给出)。两者具有相同的结构:一列“ID”,一列“TIME”,时间戳以 2 小时为步长,一列测量数据名为“upltu12_plt”。大多数时候只有一个设备处于活动状态,因此另一个设备此时没有行。但有时两者都处于活动状态并且有测量值。我尝试以这样的方式组合来自两个表的测量数据,我有列 TIME、upltu12_plt_1 和 upltu12_plt_2(如果一次没有设备的测量值,则包含 NULL) wanted result。 我试过
SELECT TIME,upltu12_plt AS 'upltu12_plt_1',NULL AS 'upltu12_plt_2' FROM sx1batt101m_c2h1_0001
UNION
SELECT TIME,NULL AS 'upltu12_plt_1',upltu12_plt AS 'upltu12_plt_2' FROM sx2batt102m_c2h1_0001
ORDER BY TIME ASC
带来了这个结果Screenshot of result。这些列正如我所希望的那样,但是当两个设备在一个时间戳上都有数据时,会有两行。
我也试过
(SELECT A.TIME AS TIME1,A.upltu12_plt,B.TIME AS TIME2,B.upltu12_plt FROM sx1batt101m_c2h1_0001 as A LEFT JOIN sx2batt102m_c2h1_0001 AS B ON A.TIME=B.TIME
UNION
SELECT A.TIME,B.TIME,B.upltu12_plt FROM sx1batt101m_c2h1_0001 AS A RIGHT JOIN sx2batt102m_c2h1_0001 AS B ON A.TIME=B.TIME)
ORDER BY TIME1 ASC
在这个 sql 语句中,有两列带有时间戳 (Result)。 谁能告诉我是否可以仅使用 sql 语句解决我的问题以及我必须使用什么语句? 亲切的问候 Jan-Hendrik
解决方法
我认为您可能正在寻找的不是使用 UNION 而是使用 CROSS JOIN。 Check this resource out.
,欢迎来到 S/O。您需要的是完全连接(链接显示完全/交叉之间的差异)
完全连接,其中基于同一时间的连接将始终来自任一侧,但如果它们存在于两侧,则会给出我认为您正在寻找的内容。
SELECT
A.TIME AS TIME1,A.upltu12_plt A_Reading,B.upltu12_plt B_Reading
FROM
sx1batt101m_c2h1_0001 as A
FULL OUTER JOIN sx2batt102m_c2h1_0001 AS B
ON A.TIME = B.TIME
ORDER BY
A.TIME1
,
由于 MySQL 不支持 FULL OUTER JOIN
,您必须结合使用 LEFT JOIN
和 RIGHT JOIN
以及 UNION
才能获得所需的结果。
SELECT A.TIME,A.upltu12_plt AS upltu12_plt_1,B.upltu12_plt AS upltu12_plt_2
FROM sx1batt101m_c2h1_0001 AS A
LEFT JOIN sx2batt102m_c2h1_0001 AS B
ON A.TIME = B.TIME
UNION
SELECT B.TIME,B.upltu12_plt AS upltu12_plt_2
FROM sx1batt101m_c2h1_0001 AS A
RIGHT JOIN sx2batt102m_c2h1_0001 AS B
ON A.TIME = B.TIME;