我几天来一直在寻找如何做到这一点 - 不幸的是我对SQL查询没有多少经验,所以这是一个试验和错误。
基本上,我创建了两个表 - 都有一个DateTime列和一个带有值的不同列。 DateTime列在每个表中都有不同的值。
因此...
ACOQ1 (Table 1)
===============
| DateTime | ACOQ1_Pump_Running |
|----------+--------------------|
| 7:14:12 | 1 |
| 8:09:03 | 1 |
ACOQ2 (Table 2)
===============
| DateTime | ACOQ2_Pump_Running |
|----------+--------------------|
| 3:54:20 | 1 |
| 7:32:57 | 1 |
我想将这两个表组合成如下:
| DateTime | ACOQ1_Pump_Running | ACOQ2_Pump_Running |
|----------+--------------------+--------------------|
| 3:54:20 | 0 OR NULL | 1 |
| 7:14:12 | 1 | 0 OR NULL |
| 7:32:57 | 0 OR NULL | 1 |
| 8:09:03 | 1 | 0 OR NULL |
我通过创建第三个表来实现这一点,'第二个表是来自两个表的UNION的DateTime列,然后将第三个表的DateTime列用于新表,但是想知道是否有办法跳过这一步。 (最后我将从不同的表中添加越来越多的列,并且实际上并不想通过创建可能不必要的联合DateTime表来添加更多的处理时间。)
我目前的工作代码:
CREATE TABLE JointDateTime
(
DateTime CHAR(50)
CONSTRAINT [pk_Key3] PRIMARY KEY (DateTime)
);
INSERT INTO JointDateTime (DateTime)
SELECT ACOQ1.DateTime FROM ACOQ1
UNION
SELECT ACOQ2.DateTime FROM ACOQ2
SELECT JointDateTime.DateTime, ACOQ1.ACOQ1_NO_1_PUMP_RUNNING, ACOQ2.ACOQ2_NO_1_PUMP_RUNNING
FROM (SELECT ACOQ1.DateTime FROM ACOQ1
UNION
SELECT ACOQ2.DateTime FROM ACOQ2) JointDateTime
LEFT OUTER JOIN ACOQ1
ON JointDateTime.DateTime = ACOQ1.DateTime
LEFT OUTER JOIN ACOQ2
ON JointDateTime.DateTime = ACOQ2.DateTime
答案 0 :(得分:5)
你需要这样一个普通的FULL OUTER JOIN
。
SELECT COALESCE(A1.DateTime,A2.DateTime) DateTime,ACOQ1_Pump_Running, ACOQ2_Pump_Running
FROM ACOQ1 A1
FULL OUTER JOIN ACOQ2 A2
ON A1.DateTime = A2.DateTime
这将为NULL
,ACOQ1_Pump_Running
提供ACOQ2_Pump_Running
,表示与相应表格中的日期不匹配的行。如果您需要0
,只需使用COALESCE
或ISNULL
。
旁注::在您的脚本中,我看到您正在使用DateTime CHAR(50)
。请使用appropriate types