powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему, если внутри CROSS APPLY есть агрегат, то он работает, как OUTER APPLY
5 сообщений из 5, страница 1 из 1
Почему, если внутри CROSS APPLY есть агрегат, то он работает, как OUTER APPLY
    #39942724
Mikhail__174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для примера, есть простая таблица с данными:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE tbl (
id int,
num int 
) 
GO
INSERT INTO tbl
VALUES  
    (1,1000)
   ,(2,1000)
   ,(3,2000)
   ,(4,2000)
   ,(5,3000)
   ,(6,3000)


Тут CROSS APPLY работает верно:
Код: sql
1.
2.
3.
select *
from tbl t1
CROSS APPLY (select top 1 id from tbl t2 where t1.num = -1 order by id asc) apply_min


Код: plaintext
1.
2.
| id | num | id |  
        
Но когда я пытаюсь то же самое сделать через агрегатную функцию, то CROSS APLLY работает, как OUTER. Почему?
Код: sql
1.
2.
3.
select *
from tbl t1
CROSS APPLY (select min(id) min from tbl t2 where t1.num = -1) apply_min


...
Рейтинг: 0 / 0
Почему, если внутри CROSS APPLY есть агрегат, то он работает, как OUTER APPLY
    #39942728
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikhail__174,

Потому что агрегатные функции всегда возвращают в таком случае одну строку, в которой, если значений не найдено, будет NULL.

Можете попробовать добавить в подзапрос GROUP BY num, тогда вроде должен перестать.

Кстати, какой-то у вас странный подзапрос - где условие корреляции?
...
Рейтинг: 0 / 0
Почему, если внутри CROSS APPLY есть агрегат, то он работает, как OUTER APPLY
    #39942733
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael
Потому что агрегатные функции всегда возвращают в таком случае одну строку, в которой, если значений не найдено, будет NULL.

COUNT вернёт 0. Возможно, причина в том, что
Except for COUNT, aggregate functions ignore null values.
https://docs.microsoft.com/en-us/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-ver15
...
Рейтинг: 0 / 0
Почему, если внутри CROSS APPLY есть агрегат, то он работает, как OUTER APPLY
    #39942757
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
COUNT вернет 0, но может и NULL, смотря как написать.
Сон Веры Павловны
Except for COUNT, aggregate functions ignore null values.

https://docs.microsoft.com/en-us/sql/t-sql/functions/aggregate-functions-transact-sql?view=sql-server-ver15 А вот это странное утверждение, учитывая, что вообще-то COUNT(ColumnName) тоже игнорирует NULL (правда, только в такой форме и в соотв. столбце).
...
Рейтинг: 0 / 0
Почему, если внутри CROSS APPLY есть агрегат, то он работает, как OUTER APPLY
    #39942825
Mikhail__174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ennor Tiegael
Mikhail__174,

Потому что агрегатные функции всегда возвращают в таком случае одну строку, в которой, если значений не найдено, будет NULL.

Можете попробовать добавить в подзапрос GROUP BY num, тогда вроде должен перестать.
Спасибо, это верно.
Ennor Tiegael
Кстати, какой-то у вас странный подзапрос - где условие корреляции?
я его специально сломал, чтобы не было внутреннего соединения.
P.S. также нашёл ответ тут , он аналогичен Вашему
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему, если внутри CROSS APPLY есть агрегат, то он работает, как OUTER APPLY
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]