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

Откуда:
Сообщений: 159
Добрый день.
У меня есть представление. Мне надо сделать полное само объединение, но в каждом варианте свои условия.
алгоритм такой:
1. применить фильтр к первому виду;
2. применить фильтр ко второму виду;
3. объединить по условию.
такой запрос работает верно:
select 	
	HSP_MVZ.object_name MVZ_NAME,
	HSP_MVZ.alias MVZ_ALIAS,
	HSP_MVZ_K.object_name CONTR_NAME,
	CASE WHEN('K'+HSP_MVZ.object_name)=HSP_MVZ_K.object_name THEN 'TRUE' ELSE 'FALSE' END RESULT 
from (select * from HYP_DS_TANDER.dbo.hsp_mvz_tree 
	where (parent_name in ('SB.00001',  'LG.00001', 'LG.0002')And (has_children=0)))HSP_MVZ
full join
(select * from HYP_DS_TANDER.dbo.hsp_mvz_tree 
	where (parent_name in ('KSB.00001',  'KLG.00001', 'KLG.0002')And (has_children=0)))HSP_MVZ_K
on ('K'+HSP_MVZ.object_name)=HSP_MVZ_K.object_name

запрос выводит 358 записей

а нужен запрос такой:
select 	
	HSP_MVZ.object_name MVZ_NAME,
	HSP_MVZ.alias MVZ_ALIAS,
	HSP_MVZ_K.object_name CONTR_NAME,
	CASE WHEN('K'+HSP_MVZ.object_name)=HSP_MVZ_K.object_name THEN 'TRUE' ELSE 'FALSE' END RESULT 
from	HYP_DS_TANDER.dbo.hsp_mvz_tree  as  HSP_MVZ 
full join HYP_DS_TANDER.dbo.hsp_mvz_tree  as  HSP_MVZ_K 
ON ('K'+HSP_MVZ.object_name)=HSP_MVZ_K.object_name
where		(1=1)	
and (HSP_MVZ.parent_name in ('SB.00001',  'LG.00001', 'LG.0002')And (HSP_MVZ.has_children=0))
and (HSP_MVZ_K.parent_name in ('KSB.00001',  'KLG.00001', 'KLG.0002')And (HSP_MVZ_K.has_children=0))

запрос выводит 350 записей. Похоже на inner join.
Почему так происходит и какая последовательность действий в операторе select.
16 авг 13, 16:25    [14719587]     Ответить | Цитировать Сообщить модератору
 Re: Full join работает как inner join  [new]
Dika!
Member

Откуда:
Сообщений: 159
ошибка нашла в условии фильтрации
(HSP_MVZ.parent_name in ('SB.00001',  'LG.00001', 'LG.0002')And (HSP_MVZ.has_children=0))
or (HSP_MVZ_K.parent_name in ('KSB.00001',  'KLG.00001', 'KLG.0002')And (HSP_MVZ_K.has_children=0))

запрос вернул 358 записей.
Интересует алгоритм выполнения. Сначала происходит объединение, а потом фильтрация или наоборот? План запроса посмотреть не могу, пишет ошибку
16 авг 13, 16:30    [14719628]     Ответить | Цитировать Сообщить модератору
 Re: Full join работает как inner join  [new]
iap
Member

Откуда: Москва
Сообщений: 46999
Dika!
Интересует алгоритм выполнения. Сначала происходит объединение, а потом фильтрация или наоборот?
Порядок обработки инструкции SELECT
Следующие действия демонстрируют порядок обработки инструкции SELECT.

1.FROM
2.ON
3.JOIN
4.WHERE
5.GROUP BY
6.WITH CUBE или WITH ROLLUP
7.HAVING
8.SELECT
9.DISTINCT
10.ORDER BY
11.TOP
SELECT (Transact-SQL)

В WHERE надо учитывать, что FULL JOIN возвращает NULL в строках, которым не нашлось соответствия.
Иначе отличия от INNER JOIN не будет.
16 авг 13, 18:28    [14720284]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить