加入两个表 - 一个具有不同值的公共列

时间:2015-05-22 09:39:34

标签: sql sql-server join sql-server-2000

我几天来一直在寻找如何做到这一点 - 不幸的是我对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

1 个答案:

答案 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

这将为NULLACOQ1_Pump_Running提供ACOQ2_Pump_Running,表示与相应表格中的日期不匹配的行。如果您需要0,只需使用COALESCEISNULL

旁注::在您的脚本中,我看到您正在使用DateTime CHAR(50)。请使用appropriate types