Имя: Пароль:
1C
1C 7.7
v7: 1С++ SQL избавиться от вложенного подзапроса
0 Холст
 
05.02.14
14:17
типовая ТиС, SQL 2005, 1С++
задача получить таблицу Заявок и сумму проведенных подчиненных Реализаций к ним, если такие есть, если проведенных Реализаций нет, то просто выводить Заявки

набросал работающий запрос
Select top 500
cast(Ж.iddocdef as char(4)) + Ж.iddoc[Док$Документ]
-- , $ДокЗ.Контрагент as [Контрагент$Справочник.Контрагенты]
, $ДокЗ.Сумма СумЗаявки
--, $ДокР.Сумма СумРеализации
, sum($ДокР.Сумма) СумРеализации
, COUNT(ДокР.iddoc) КолР
FROM _1SJourn as Ж (NOLOCK)
, $Документ.ЗаявкаПокупателя as  ДокЗ
left join
(Select --top 50
ДокР.*
FROM _1SJourn as Ж (NOLOCK)
, $Документ.Реализация as  ДокР  (NOLOCK)
where 1=1
and Ж.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата
and Ж.Closed & 1 = 1
and Ж.IdDoc = ДокР.IdDoc) as ДокР
on Substring($ДокР.ДокОснование,5,15) = ДокЗ.IdDoc
where 1=1
and Ж.Date_Time_IDDoc BETWEEN :НачДата AND :КонДата
and Ж.IdDoc = ДокЗ.IdDoc
-- and $ДокЗ.Сумма <> $ДокР.Сумма
group by Ж.iddocdef, Ж.iddoc, $ДокЗ.Сумма

как можно избавиться от вложенного SElect-а, не исказив результата ?
1 dk
 
05.02.14
14:19
а чем вложенный не угодил?
2 Ёпрст
 
гуру
05.02.14
14:20
можно, всё в топку, слепить запрос к _1scrdoc, наслаждаться
3 Ёпрст
 
гуру
05.02.14
14:20
(1) тем, что не работает
4 Холст
 
05.02.14
14:23
(1) вложенный медленно же
(2) с  _1scrdoc же все равно надо будет сцепку с Журналом по Реализациям делать чтобы только проведенные отобрать, не ?
5 Холст
 
05.02.14
14:25
есть еще мысля сложить 2 запроса (union all) - один с Заявками без подчиненных другой с подчиненными проведенными. Но быстрейший ли будет результат ?
6 Ёпрст
 
гуру
05.02.14
14:54
(4) там не будет коррелированного подзапроса
7 Холст
 
05.02.14
15:05
(6) так,
Коррелированный подзапрос - это такой подзапрос, который содержит ссылку на столбец, который есть во внешнем запросе.
значит в случае с  _1scrdoc  подзапрос останется, но не будет коррелированного и значит быстрей будет работать...
мне пока это не очевидно
если у тебя есть кусок такого запроса с  _1scrdoc который можешь сюда кинуть было бы неплохо а то не соображу так сразу как это поможет, ведь сцепка с  _1SJourn по подчиненным для вылавливания только проведенных подчиненных все равно должна остаться ?
8 Ёпрст
 
гуру
05.02.14
15:11
подзапроса там не будет, вообще.
9 Холст
 
05.02.14
15:24
(8) да подзапроса не будет, но пока вместо 1 left join
у меня набирается 3 left join -а

т.е.
FROM $Документ.ЗаявкаПокупателя
left join _1scrdoc  --связка подчиненного
left join _1SJourn --условие на проведенность
left join $Документ.Реализация --добыча суммы

с _1scrdoc еще не сделал, вместо него использовал повторно $Документ.Реализация с другим алиасом для добычи подчиненности

и такой запрос работает медленнее подзапроса пока
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший