Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сцепить 2 таблицы с null полями  [new]
wizzard2009
Member

Откуда: Москва
Сообщений: 19
Есть 2 таблицы

Таблица А(id,A,B)
1 1 NULL
2 NULL 2
3 1 1
4 2 2
5 1 2

Таблица B(id,A,B)
1 NULL 2
2 1 NULL
3 1 2
4 2 1
Нужно получить следующее
Таблица 3(А.id,B.id,A,B)
1 2 1 NULL
2 1 NULL 2
5 3 1 2

По другому.
В таблицах A и B есть одинаковые строки
Нужно получить результирующую со столбцами из ключей отдельных таблиц
плюс данные из совпадающих строк.
Строки повторяются по 1 разу.
17 авг 12, 18:31    [13028601]     Ответить | Цитировать Сообщить модератору
 Re: Сцепить 2 таблицы с null полями  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
wizzard2009,
Для версии MS SQL 2008
declare @a table (id int, A int, B int)
insert into @a (id, A, B)
select 1, 1, null
union all
select 2, null, 2
union all
select 3, 1, 1
union all
select 4, 2, 2
union all
select 5, 1, 2

declare @b table (id int, A int, B int)
insert into @b (id, A, B)
select 1, null, 2
union all
select 2, 1, null
union all
select 3, 1, 2
union all
select 4, 2, 1
----------------------------------
--select A, B from @a
--intersect
--select A,B from @b

select 
t1.id
, t2.id
, tt.A, tt.B
from 
(
select A, B from @a
intersect
select A,B from @b
) tt
left join @a t1 on isnull(tt.A,-1) =isnull(t1.A,-1) and isnull(tt.B,-1) =isnull(t1.B,-1)
left join @b t2 on isnull(tt.A,-1) =isnull(t2.A,-1) and isnull(tt.B,-1) =isnull(t2.B,-1)
order by t1.id
17 авг 12, 21:00    [13029086]     Ответить | Цитировать Сообщить модератору
 Re: Сцепить 2 таблицы с null полями  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
trew, у вас 2008, а пишете постоянно UNION ALL SELECT - в глазах рябит, используйте констркуцию VALUE. Это первое.
Второе, злоупотребление функциями чревато ибо анализ статистики сразу отбрасывается.
И главное, накуя тут INTERSECT ?!! Обычного JOIN мало?! Зачем дублирования сравнения?!
Или ваша цель оказать максимальный ущерб сообществу?

DECLARE	@A TABLE (ID Int, A Int, B Int)
DECLARE	@B TABLE (ID Int, A Int, B Int)

INSERT	@A VALUES
 (1, 1, NULL)
,(2, NULL, 2)
,(3, 1, 1)
,(4, 2, 2)
,(5, 1, 2)

INSERT	@B VALUES
 (1, NULL, 2)
,(2, 1, NULL)
,(3, 1, 2)
,(4, 2, 1)
----------------------------------
SELECT	 A.ID
	,B.ID
	,A.A
	,A.B
FROM 	     @A	A
	JOIN @B	B ON(B.A = A.A OR A.A IS NULL AND B.A IS NULL)
		 AND(B.B = A.B OR A.B IS NULL AND B.B IS NULL)
wizzard2009, что за базовые вопросы уровня детсада. Вы что JOIN не знаете?
17 авг 12, 22:11    [13029299]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить