2015-05-22 2 views
4

Я искал для себя, как это сделать в течение нескольких дней - к сожалению, у меня нет большого опыта работы с 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  |

я достиг этого, создав третью таблицу, что «Союза столбец 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

Не используйте 'CHAR' для хранения дат – ughai

+0

Что я должен использовать вместо этого? Он хранит его в настоящее время как 11 мая 2015 года 07:14:12, поэтому, вероятно, он захочет в этом формате еще. – chrisj91

+0

Используйте 'datetime' и используйте' convert' или 'format'. какую версию сервера sql вы используете? – ughai

ответ

4

Вам нужен простой старый 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

+0

Просто попробовал и работал как шарм. Большое спасибо - кажется, так просто сейчас, но проблема в том, что я все еще изучаю веревки с SQL, поэтому не всегда знаю, как лучше всего это делать! – chrisj91

+0

Еще раз спасибо за быстрый ответ - я использую SQL Server Enterprise Manager версии 8.00.2039, кстати, – chrisj91

+0

SQL Server 2000 – chrisj91

Смежные вопросы