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

Откуда:
Сообщений: 770
Собственно, текст запроса вот:
Declare @t table (id int, id2 int, t varchar(255))

insert into @t 
Values
(1, 1, 't1'),
(1, 1, 't2'),
(1, 1, 't3'),
(2, 2, 't4'),
(3, 2, 't5'),
(4, 1, 't6')

Select Distinct a.id, c.t from @t a
	Cross apply
		(select '/' + b.t as [data()]
		from @t b
			where a.id = b.id2
		--for xml path('')
		) c(t)  

С закомментированнным for xml path('') он отрабатывает ожидаемо:

id t
1 /t1
1 /t2
1 /t3
1 /t6
2 /t4
2 /t5
А вот с раскомментированным - неожиданно!

id t
1 /t1 /t2 /t3 /t6
2 /t4 /t5
3 NULL
4 NULL

Почему???
Воспроизводится и на 2008R2, и на 2016SP1.
5 фев 18, 08:29    [21165541]     Ответить | Цитировать Сообщить модератору
 Re: Почему запрос на агрегацию строк с for xml так странно работает?  [new]
Добрый Э - Эх
Guest
uaggster,

что именно тебя удивляет?
5 фев 18, 08:32    [21165547]     Ответить | Цитировать Сообщить модератору
 Re: Почему запрос на агрегацию строк с for xml так странно работает?  [new]
Добрый Э - Эх
Guest
uaggster,

если что, кури в сторону агрегатных запросов без фразы GROUP BY....
сравни результат вывода:

select max(id2) from @t where 1 = 2
select max(id2) from @t where 1 = 2 group by id

в первом случае ты получаешь результирующий набор в одну строку с ПУСТЫМ ЗНАЧЕНИЕМ.
во втором - ПУСТОЕ МНОЖЕСТВО, не содержание ни одной строки.
Чувствуешь разницу?
5 фев 18, 08:44    [21165571]     Ответить | Цитировать Сообщить модератору
 Re: Почему запрос на агрегацию строк с for xml так странно работает?  [new]
Добрый Э - Эх
Guest
uaggster,

ну, если вдруг, ты не понял аналогии, то for xml path('') - это, как бы, "аналог" агрегатного подзапроса без кляузы GROPU BY. То есть, он всегда вернет "одну строку" на выходе, вне зависимости от ложности или истинности условий соединения со внешней таблицей...
Другое дело, что эта "одна строка" будет либо содержать результат конкатенации всех строк, удовлетворяющих условию WHERE, либо "пустное значение", если условия WHERE окажется "ложным"
5 фев 18, 09:09    [21165597]     Ответить | Цитировать Сообщить модератору
 Re: Почему запрос на агрегацию строк с for xml так странно работает?  [new]
uaggster
Member

Откуда:
Сообщений: 770
Добрый Э - Эх
uaggster,

что именно тебя удивляет?

Меня удивляет, что (вроде бы) если cross apply не вернул ни одной строки, значит и строка, с которой происходит соединение, и результат функции (в данном случае - подчиненный селект) - в выборку попасть не должны.
Вроде бы.
5 фев 18, 09:12    [21165603]     Ответить | Цитировать Сообщить модератору
 Re: Почему запрос на агрегацию строк с for xml так странно работает?  [new]
uaggster
Member

Откуда:
Сообщений: 770
Добрый Э - Эх
uaggster,

ну, если вдруг, ты не понял аналогии, то for xml path('') - это, как бы, "аналог" агрегатного подзапроса без кляузы GROPU BY. То есть, он всегда вернет "одну строку" на выходе, вне зависимости от ложности или истинности условий соединения со внешней таблицей...
Другое дело, что эта "одна строка" будет либо содержать результат конкатенации всех строк, удовлетворяющих условию WHERE, либо "пустное значение", если условия WHERE окажется "ложным"

А почему это так???
Чем диктуется такое поведение?
5 фев 18, 09:14    [21165607]     Ответить | Цитировать Сообщить модератору
 Re: Почему запрос на агрегацию строк с for xml так странно работает?  [new]
Добрый Э - Эх
Guest
uaggster,

ещё раз говорю - проделай эксперимент с агрегатным подзапросом без GROUP BY. Результат будет аналогичный, потому что агрегатный запрос (читай с for xml) без group by - всегда возвращает ровно одну строку, вне зависимости от числа строк, попавших в обработку...
Касательно apply - он при cross нотации возвращает в итоговый датасет строки, для которых подзапрос оказался "непустым множеством".
так вот, твой for xml делает результирующий датасет подзапроса - "непустым"... потому строки из основной таблицы и выталкиваются в итоговый результат...
5 фев 18, 09:16    [21165616]     Ответить | Цитировать Сообщить модератору
 Re: Почему запрос на агрегацию строк с for xml так странно работает?  [new]
Добрый Э - Эх
Guest
uaggster
А почему это так???
Чем диктуется такое поведение?
документацией и стандартом ANSI-SQL
5 фев 18, 09:17    [21165618]     Ответить | Цитировать Сообщить модератору
 Re: Почему запрос на агрегацию строк с for xml так странно работает?  [new]
uaggster
Member

Откуда:
Сообщений: 770
Добрый Э - Эх
так вот, твой for xml делает результирующий датасет подзапроса - "непустым"... потому строки из основной таблицы и выталкиваются в итоговый результат...

Выделенное курсивом - разумеется, понятно.
Непонятное - выделенное жирным.

Почему for xml - делает результат датасета - непустым?
Я понимаю, что это диктуется стандартом (если б это можно было списать на баг, это не воспроизводилось бы на разных версиях), не не понимаю, где это посмотреть!
5 фев 18, 10:52    [21165948]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить