MySQL JOIN/UNION
MySQL JOIN/UNION
我有两个 table 包含来自两个测量设备的测量数据(table 结构由数据采集软件给出)。两者具有相同的结构:一列“ID”,一列“TIME”,时间戳以 2 小时为单位,一列测量数据名为“upltu12_plt”。大多数时候只有一个设备处于活动状态,因此另一个设备此时没有行。但有时两者都处于活动状态并且具有测量值。我尝试以这种方式组合来自两个 tables 的测量数据,我有时间列,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,A.upltu12_plt,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。您需要的是 FULL JOIN(link 显示 full/cross 之间的差异)
完全连接,其中基于同一时间的连接将始终从任何一方获得,但如果它们存在于双方,将提供我认为您正在寻找的内容。
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,
A.upltu12_plt AS upltu12_plt_1,
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;
我有两个 table 包含来自两个测量设备的测量数据(table 结构由数据采集软件给出)。两者具有相同的结构:一列“ID”,一列“TIME”,时间戳以 2 小时为单位,一列测量数据名为“upltu12_plt”。大多数时候只有一个设备处于活动状态,因此另一个设备此时没有行。但有时两者都处于活动状态并且具有测量值。我尝试以这种方式组合来自两个 tables 的测量数据,我有时间列,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,A.upltu12_plt,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。您需要的是 FULL JOIN(link 显示 full/cross 之间的差异)
完全连接,其中基于同一时间的连接将始终从任何一方获得,但如果它们存在于双方,将提供我认为您正在寻找的内容。
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,
A.upltu12_plt AS upltu12_plt_1,
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;