Информация об изменениях

Сообщение Re[3]: left join vs outer apply от 29.08.2015 19:29

Изменено 29.08.2015 20:01 Serginio1

Здравствуйте, Olaf, Вы писали:



O>[sql]

O>/*1*/
O>select *
O>from Sales.SalesOrderHeader h
O>left join
O>(
O> select top 1 with ties d1.SalesOrderID, d1.OrderQty
O> from Sales.SalesOrderDetail d1
O> order by row_number() over(partition by d1.SalesOrderID order by d1.OrderQty desc)
O>) d on h.SalesOrderID = d.SalesOrderID

Большое спасибо. Кстати вот работая с 1С совсем от жизни отстал. Например мне 1 часть твоего ответа
в http://rsdn.ru/forum/db/6043892.flat
Автор: MasterMind
Дата: 11.05.15

понятна
а вот по второму, нужно понимать, что select top 1 with ties возьмет только по первой строке из партиции?
https://msdn.microsoft.com/ru-ru/library/ms189463(v=SQL.120).aspx

WITH TIES
Используется, если требуется вернуть две или более строки, которые совместно занимают последнее место в ограниченном результирующем наборе. Требуется использовать с предложением ORDER BY. WITH TIES может привести к тому, что вернется строк больше, чем указано в значении expression. Например, если expression имеет значение 5, но еще 2 строки соответствуют значениям в столбцах ORDER BY в строке 5, то результирующий набор будет содержать 7 строк.
Предложение TOP...WITH TIES может быть задано только в инструкциях SELECT, и только если указано предложение ORDER BY. Порядок возврата связанных записей произволен. ORDER BY не влияет на это правило.


Понял вернет все записи по 1 row_number()
Спасибо не знал.

А как например по top (3)

Кстати решал аналогичную задачу с предварительным индексированием.
http://www.forum.mista.ru/topic.php?id=564849#40
Здравствуйте, Olaf, Вы писали:



O>[sql]

O>/*1*/
O>select *
O>from Sales.SalesOrderHeader h
O>left join
O>(
O> select top 1 with ties d1.SalesOrderID, d1.OrderQty
O> from Sales.SalesOrderDetail d1
O> order by row_number() over(partition by d1.SalesOrderID order by d1.OrderQty desc)
O>) d on h.SalesOrderID = d.SalesOrderID

Большое спасибо. Кстати вот работая с 1С совсем от жизни отстал. Например мне 1 часть твоего ответа
в http://rsdn.ru/forum/db/6043892.flat
Автор: MasterMind
Дата: 11.05.15

понятна
а вот по второму, нужно понимать, что select top 1 with ties возьмет только по первой строке из партиции?
https://msdn.microsoft.com/ru-ru/library/ms189463(v=SQL.120).aspx

WITH TIES
Используется, если требуется вернуть две или более строки, которые совместно занимают последнее место в ограниченном результирующем наборе. Требуется использовать с предложением ORDER BY. WITH TIES может привести к тому, что вернется строк больше, чем указано в значении expression. Например, если expression имеет значение 5, но еще 2 строки соответствуют значениям в столбцах ORDER BY в строке 5, то результирующий набор будет содержать 7 строк.
Предложение TOP...WITH TIES может быть задано только в инструкциях SELECT, и только если указано предложение ORDER BY. Порядок возврата связанных записей произволен. ORDER BY не влияет на это правило.


Понял вернет все записи по 1 row_number()
Спасибо не знал.

А как например по top (3)

Кстати решал аналогичную задачу с предварительным индексированием.
http://www.forum.mista.ru/topic.php?id=564849#40

Кстати интересно если SalesOrderDetail загрузить в темповую таблицу, проиндексировать, а затем выполнить к ней запрс

select *
from Sales.SalesOrderHeader h
outer apply
(
select top 1 d1.SalesOrderID, d1.OrderQty
from #TempSalesOrderDetail d1
where d1.SalesOrderID = h.SalesOrderID
order by d1.OrderQty desc
) d