MySQL 加入/联合

问题描述

我有两个表格,其中包含来自两个测量设备的测量数据(表格结构由数据采集软件给出)。两者具有相同的结构:一列“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。您需要的是完全连接(链接显示完全/交叉之间的差异)

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...