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 之间的差异)

Full Join vs Cross Join

完全连接,其中基于同一时间的连接将始终从任何一方获得,但如果它们存在于双方,将提供我认为您正在寻找的内容。

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 JOINRIGHT 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;