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

Откуда:
Сообщений: 1906
Хочу понять суть этих опреаторов.
Везде пишут, что это как бы join, но как бы не join, но c join можно добиться того же. Вроде как какое-то действие выполняется для каждой строки из левой таблицы с участием данных из правой.

Как я понял, суть обычно в кореллированности подзапроса, но всё равно полного понимания у меня не пришло как работают эти операторы.

Не могли бы привести какой-то полноценный понятный пример, что бы почувствовать.
23 сен 16, 13:14    [19700239]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
questioner,

Ицик Бен Ган Создание запросов - Глава 4. Доходчивее некуда :)
23 сен 16, 13:16    [19700254]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
Megabyte
Member

Откуда: ближайшее заМКАДье
Сообщений: 4997
questioner
Хочу понять суть этих опреаторов.
Везде пишут, что это как бы join, но как бы не join, но c join можно добиться того же. Вроде как какое-то действие выполняется для каждой строки из левой таблицы с участием данных из правой.

Как я понял, суть обычно в кореллированности подзапроса, но всё равно полного понимания у меня не пришло как работают эти операторы.

Не могли бы привести какой-то полноценный понятный пример, что бы почувствовать.

Оба выполняются на каждую строку из верхнего подзапроса.
outer apply - left join,
cross apply - inner join

з.ы. в инете полно примеров.
23 сен 16, 16:22    [19701506]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
questioner
Member

Откуда:
Сообщений: 1906
Megabyte
outer apply - left join,
cross apply - inner join

з.ы. в инете полно примеров.


а на..., простите, зачем, дублированная функциональность?
23 сен 16, 17:00    [19701682]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
questioner
Megabyte
outer apply - left join,
cross apply - inner join

з.ы. в инете полно примеров.


а на..., простите, зачем, дублированная функциональность?

кореллированности подзапроса
23 сен 16, 17:01    [19701686]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
questioner
Member

Откуда:
Сообщений: 1906
вот конкретный вопрос

  select  distinct s.* from Salary s
  cross apply 
  (select top 2 sal.* from Salary sal where sal.user_id = s.user_id  order by sal.salary) as result

из таблицы


user_id	salary	month
1	100	1
1	150	2
1	200	3
1	180	4
1	140	5
2	10	1
2	40	2
2	20	3
2	15	4
2	45	5
3	55	1



Возвращает
user_id	salary	month
1	100	1
1	150	2
1	200	3
1	180	4
1	140	5
2	10	1
2	40	2
2	20	3
2	15	4
2	45	5
3	55	1


expected result - 2 самые низкие зп для юзера
23 сен 16, 17:12    [19701743]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
questioner
Member

Откуда:
Сообщений: 1906
а вот запрос

select * from dbo.Countries c 
  cross apply (select top 2 * from dbo.Cities city where city.CountryID = c.CountryID order by city.City) ap


возвращает для каждой страны 2 первых города по алфавиту
23 сен 16, 17:14    [19701747]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
questioner,

блин, да хоть что-нибудь прочитайте про sql прежде чем строчить запросы....

 select  distinct s.* from Salary s


select * from dbo.Countries c 
23 сен 16, 17:16    [19701754]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
questioner
Member

Откуда:
Сообщений: 1906
TaPaK
questioner,

блин, да хоть что-нибудь прочитайте про sql прежде чем строчить запросы....

 select  distinct s.* from Salary s


select * from dbo.Countries c 


это не меняет ситуацию. Если убрать distinct, то вообще получится декартово произведение
23 сен 16, 17:18    [19701766]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
questioner,
автор
это не меняет ситуацию. Если убрать distinct, то вообще получится декартово произведение

это не отменяет ситуацию, что вы ни хрена не понимаете что пишете
23 сен 16, 17:19    [19701774]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
questioner
Member

Откуда:
Сообщений: 1906
questioner
TaPaK
questioner,

блин, да хоть что-нибудь прочитайте про sql прежде чем строчить запросы....

 select  distinct s.* from Salary s


select * from dbo.Countries c 


это не меняет ситуацию. Если убрать distinct, то вообще получится декартово произведение


ладно, вру

user_id	salary	month
1	100	1
1	100	1
1	150	2
1	150	2
1	200	3
1	200	3
1	180	4
1	180	4
1	140	5
1	140	5
2	10	1
2	10	1
2	40	2
2	40	2
2	20	3
2	20	3
2	15	4
2	15	4
2	45	5
2	45	5
3	55	1


но это тоже не то, что я хочу и я не понимаю как это работает
23 сен 16, 17:20    [19701775]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
questioner
Member

Откуда:
Сообщений: 1906
TaPaK
questioner,
автор
это не меняет ситуацию. Если убрать distinct, то вообще получится декартово произведение

это не отменяет ситуацию, что вы ни хрена не понимаете что пишете


Я ж не заставляю Вас отвечать. Если вы не можете/хотите, то это Ваше право. Учить меня жизни не надо. С моей точки зрения я достаточно приложил усилий, чтобы понять, но не понял, поэтому обратился за помощью.
23 сен 16, 17:22    [19701783]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
questioner,

Ицик Бен Ган Создание запросов - Глава 4
23 сен 16, 17:22    [19701787]     Ответить | Цитировать Сообщить модератору
 Re: cross apply vs outer apply  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
questioner
я не понимаю как это работает
Выполните
select
 s.*,
 result.user_id as result__user_id, result.salary as result__salary, result.month as result__month
from
 Salary s cross apply 
 (select top 2 sal.* from Salary sal where sal.user_id = s.user_id  order by sal.salary) as result
и поразмышляйте над полученным результатом.
23 сен 16, 17:54    [19701922]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить