2014-11-12 2 views
0

У меня есть результат объединения двух временных таблиц в CTE- Соединить имеет следующие поля: ID, year, flag1, flag2 Я буду называть его Table1Как заполнить?

ID year flag1 flag2 
1 2000 1  0 
2 2001 0  1 
3 2005 1  0 
4 NULL NULL NULL 
5 NULL NULL NULL 

В Table2 я следующие данные

4 2006 0  1 
5 2007 0  1 

Как объединить обе таблицы? и отображать записи с идентификатором 1, 2, 3 от результата моего соединения и идентификаторов 4,5 из таблицы2?

Как я могу объединить данные между обеими таблицами? и результат отображения, как показано ниже?

ID year flag1 flag2 
1 2000 1  0 
2 2001 0  1 
3 2005 1  0 
4 2006 0  1 
5 2007 0  1 

ответ

0

Вы можете присоединиться на ID и использование сливаются() или ISNULL(), чтобы получить правильные значения (не нулевые) для ID 4 & 5:

SELECT 
    t1.ID, 
    coalesce(t1.[year], t2.[year]) as [year], 
    coalesce(t1.flag1, t2.flag1) as flag1, 
    coalesce(t1.flag2, t2.flag2) as flag2 
FROM TABLE1 t1 
INNER JOIN TABLE2 t2 ON t1.ID = t2.ID 

сливаются() (и ISNULL ()) вернет первое ненулевое значение своих аргументов.

Это может привести к неверным результатам, если в Таблицах 1 и Таблице 2 есть сопоставимые идентификаторы, которые имеют ненулевые значения для других полей, хотя ... но для вашего примера это сработает.

+0

Спасибо, это было полезно. Что делать, если у моих полей есть столбцы NON-NULL? – Sulaiman

+0

@sweety Тогда в текущем запросе будут принимать значения из Таблицы 1 и игнорировать значения из Таблицы2. Возможно, это не так, как вы хотите, поэтому вы можете отфильтровать строки из таблицы2, чтобы они просто получали строки с нулевыми значениями. Вы можете сделать это в предложении where. – jpw

0
declare @t table (Id int,years int,flag int,flag1 int) 
insert into @t (Id,years,flag,flag1)values (1,2000,1,0), 
(2,2001,0,1),(3,2005,1,0),(NULL,NULL,NULL,null),(NULL,NULL,NULL,null) 

declare @tT table (Id int,years int,flag int,flag1 int) 
insert into @tT (Id,years,flag,flag1)values (4,2006,0,1), 
(5,2007,0,1) 

SELECT T.Id,T.years,T.flag,T.flag1 FROM @t T 
WHERE T.Id is not null and T.years is not null and T.flag is not null and T.flag1 is not null 
union 
SELECT T.Id,T.years,T.flag,T.flag1 FROM @tT T 
WHERE T.Id is not null and T.years is not null and T.flag is not null and T.flag1 is not null