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

Откуда: Minsk
Сообщений: 59
уважаемые форумчане,
помогите с запросом пожалуйста

Есть таблица

CREATE TABLE #Table1 (ComposedTableId INT,DataVariantId INT,TableId INT)

INSERT INTO #Table1
SELECT 1,1,3
UNION
SELECT 1,1,4
UNION
SELECT 1,1,5
UNION
SELECT 1,2,4
UNION
SELECT 1,2,3

/*
Здесь DataVariantId - набор данных (1 и 2)
необходимо найти в пределах это таблицы список TableId которе
1) есть во обоих вариантах данных,
2) есть только в 1
3) есть только в 2


делаю запрос
*/

SELECT dv1.TableId AS dv1TableId,dv2.TableId AS dv2TableId
FROM #Table1 dv1
LEFT JOIN #Table1 dv2 ON dv1.ComposedTableId = dv2.ComposedTableId
AND dv1.TableId = dv2.TableId
WHERE dv1.DataVariantId = 1 AND dv2.DataVariantId = 2

/*
Почему то получаю
3 3
4 4

не могу понять почему нету записи
5 NULL

*/
3 фев 12, 11:16    [12024576]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN таблицы на себя  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
design21
не могу понять почему нету записи
5 NULL
Потому что NULL=2 даёт UNKNOWN, а не TRUE
3 фев 12, 11:21    [12024616]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN таблицы на себя  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
design21,

может быть вы хотите так?
SELECT 
dv1.TableId AS dv1TableId,dv2.TableId AS dv2TableId
FROM 
	#Table1 dv1
	LEFT JOIN #Table1 dv2 ON dv1.ComposedTableId = dv2.ComposedTableId AND dv1.TableId = dv2.TableId and 	dv2.DataVariantId = 2
WHERE 
	dv1.DataVariantId = 1
3 фев 12, 11:22    [12024624]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN таблицы на себя  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
design21, смотря чего хотите отфильтровать...

SELECT dv1.TableId AS dv1TableId,dv2.TableId AS dv2TableId
FROM #Table1 dv1
LEFT JOIN #Table1 dv2 ON dv1.ComposedTableId = dv2.ComposedTableId
AND dv1.TableId = dv2.TableId AND dv2.DataVariantId = 2 
WHERE dv1.DataVariantId = 1

?
3 фев 12, 11:22    [12024625]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN таблицы на себя  [new]
design21
Member

Откуда: Minsk
Сообщений: 59
iap

Потому что NULL=2 даёт UNKNOWN, а не TRUE



Дошло!!! спасибо всем за помощь!!
3 фев 12, 11:29    [12024673]     Ответить | Цитировать Сообщить модератору
 Re: LEFT JOIN таблицы на себя  [new]
invm
Member

Откуда: Москва
Сообщений: 9842
/*
Здесь DataVariantId - набор данных (1 и 2)
необходимо найти в пределах это таблицы список TableId которе
1) есть во обоих вариантах данных,
2) есть только в 1
3) есть только в 2
*/

with t1 as
(select TableId from #Table1 where DataVariantId = 1),
t2 as
(select TableId from #Table1 where DataVariantId = 2)
select
 isnull(t1.TableId, t2.TableId) as TableId,
 case when t2.TableId is null then 'Есть в 1' when t1.TableId is null then 'Есть в 2' else 'Есть в 1 и 2' end
from
 t1 full join
 t2 on t2.TableId = t1.TableId;
3 фев 12, 11:45    [12024836]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить