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

Откуда:
Сообщений: 58
День добре!

Маленький вопрос.

	select 
		* 
	from ReportOrders ro
		left outer join 
		(
			select 
				sum(Income) as Income
			from
				GoodsInfo 
			where ReportID = ro.Report
			group by Measure
		) gi on gi.Measure = ro.GoodMeasure


The multi-part identifier "ro.Report" could not be bound.

У кого-нибудь есть идеи, как написать сей запрос без изобретения вьюх, табличных функций итд?

Спасибо.
4 авг 11, 13:48    [11070607]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
cross / outer apply
4 авг 11, 13:53    [11070646]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Ваш - вообще можно в коррелированный подзапрос.
4 авг 11, 13:54    [11070653]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
Glory
Member

Откуда:
Сообщений: 104751
select 
		* 
	from ReportOrders ro
		left outer join 
		(
			select Measure, ReportID,
				sum(Income) as Income
			from
				GoodsInfo 
			group by Measure, ReportID
		) gi on gi.Measure = ro.GoodMeasure and gi.ReportID = ro.Report
4 авг 11, 13:56    [11070670]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Гавриленко Сергей Алексеевич
cross / outer apply
В данном случае - именно OUTER APPLY (поскольку LEFT JOIN)
4 авг 11, 13:56    [11070671]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
moscas
Member

Откуда:
Сообщений: 58
большое спасибО!
4 авг 11, 14:48    [11071056]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Добрый день, я могу понять, чем OUTER APPLY лучше решения, предложенного Glory: чисто по синтаксису, в варианте, предложенном Glory, значения sum(Income) необходимо найти для всех комбинаций Measure и ReportID из таблицы GoodsInfo, тогда, как реально из них могут понадобиться только некоторые.

Но не будет ли более простым для понимания (и эффективным) вариант вроде следующего:
select
  <список полей>, sum(Income)
from
  ReportOrders ro
left join
  GoodsInfo gi
on
  gi.Measure = ro.GoodMeasure 
  and gi.ReportID = ro.Report
group by
  <список полей>
?

Чем apply лучше?
5 авг 11, 12:40    [11075807]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Shlippenbaranus
Добрый день, я могу понять, чем OUTER APPLY лучше решения, предложенного Glory: чисто по синтаксису, в варианте, предложенном Glory, значения sum(Income) необходимо найти для всех комбинаций Measure и ReportID из таблицы GoodsInfo, тогда, как реально из них могут понадобиться только некоторые.

Но не будет ли более простым для понимания (и эффективным) вариант вроде следующего:
select
  <список полей>, sum(Income)
from
  ReportOrders ro
left join
  GoodsInfo gi
on
  gi.Measure = ro.GoodMeasure 
  and gi.ReportID = ro.Report
group by
  <список полей>
?

Чем apply лучше?


Вы план запроса от Glory посмотрите сразу станет все понятно:)
а Dаш запос выдаст неправильный результат если например поля Report и GoodMeasure в таблице ReportOrders не уникальны
5 авг 11, 12:47    [11075884]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
WarAnt
а Dаш запос выдаст неправильный результат если например поля Report и GoodMeasure в таблице ReportOrders не уникальны


Ну... в общем-то, да. Только если повторяющимися будут не просто комбинации ReportID и Measure, а строки из таблицы ReportOrders полностью. Но исходя их логики названий, я слабо себе представляю подобную ситуацию :).

Если же она вероятна - то apply идет лесом, а вариант Glory может, наоборот, оказаться более предпочтительным. Т.к. APPLY, по своему определению, должен вычислять sum(Income) для КАЖДОЙ строки ReportOrders, т.е. будет по нескольку раз делать одну и ту же работу :).

Нет ли какого разъяснения относительно apply в этом аспекте? Он реально вычисляет значение функции (или вычисляет запрос) для каждой строки "внешней" таблицы, даже если эти строки одинаковы?
5 авг 11, 14:53    [11076802]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Shlippenbaranus, попробуйте выполнить:
SELECT TOP 10000 v.number,t.rnd,t.dt,t.id FROM master..spt_values v--, master..spt_values v1
CROSS APPLY (SELECT RAND(666) rnd, GETDATE() dt, NEWID() id) t
WHERE v.type='p'-- AND v1.type='p'
5 авг 11, 15:34    [11077152]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
kDnZP
Shlippenbaranus, попробуйте выполнить

Спасибо, смешно. Вот аналог, если я правильно понял Вашу мысль:
select getDate();

with i as (
  select 0 i union all select i+1 i from i where i<9
)
select
  *
from (
  select top 1000000
    a.i, b.i, c.i, d.i, e.i, f.i
  from
    i a, i b, i c, i d, i e, i f
  order by
    1, 2, 3, 4, 5, 6
  ) z (a, b, c, d, e, f)
cross apply 
  (select getDate() g, newid() h where f=0) j

select getDate()

У меня данный запрос выполняется около 20 секунд, при этом все значения g (т.е. getDate()) возвращаются ОДИНАКОВЫМИ, все значения h - как и положено, РАЗНЫМИ.

Выводы?

(Однозначных не вижу.)
5 авг 11, 16:59    [11077929]     Ответить | Цитировать Сообщить модератору
 Re: Внутри подзапроса в join окацца не видно поля из таблицы предложения from  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Shlippenbaranus, выводы просты: вычисления могут быть как однократными, так и многократными, все зависит от того, что и как считается))).
Как пример, планы двух запросов у меня идентичны:
SELECT TOP 10 v.number,t.rnd,t.rnd2,t.dt,t.id FROM master..spt_values v
CROSS APPLY (SELECT RAND(666) rnd, RAND(v.number) rnd2, GETDATE() dt, NEWID() id) t
WHERE v.type='p'
SELECT TOP 10 v.number,t.rnd, RAND(v.number) rnd2,t.dt,t.id FROM master..spt_values v
CROSS JOIN (SELECT RAND(666) rnd, GETDATE() dt, NEWID() id) t
WHERE v.type='p'
5 авг 11, 18:05    [11078323]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить