Имя: Пароль:
1C
1С v8
Оптимизировать левое соединение
0 RHCP
 
06.12.13
12:19
Имеется документ с ТЧ:

Контрагент-----Период----------Сумма
Иванов---------01.01.2013------100          
Иванов---------01.02.2013------200
Иванов---------01.03.2013------300
Петров---------01.01.2013------10
Петров---------01.03.2013------30
..

период - всегда начало месяца текущего года.


нужно получить таблицу:

Контрагент--------Январь---------Февраль----------Март-----..
Иванов------------100------------200--------------300---..
Петров------------10-------------0----------------30----..

и тд

вот код запроса:

ВЫБРАТЬ РАЗЛИЧНЫЕ
ТЧ.контрагент КАК Контрагент
Поместить РазличныеКонтрагенты
ИЗ Док.мояТЧ КАК ТЧ
ГДЕ ТЧ.Ссылка = &ССылка
;
Выбрать
РазличныеКонтрагенты.Контрагент
ТЧЯнварь.Сумма КАК СуммаЯнварь,
ТЧФевраль.Сумма КАК СуммаФевраль,
ТЧМарт.Сумма КАК СуммаМарт
ИЗ РазличныеКонтрагенты КАК РазличныеКонтрагенты
Левое соединение Документ.МойДок.МояТЧ КАК ТЧЯнварь
ПО РазличныеКонтрагенты.контрагент = ТЧЯнварь.Контрагент
И (ТЧЯнварь.период = &ПериодЯнварь)
Левое соединение Документ.МойДок.МояТЧ КАК ТЧФевраль
ПО РазличныеКонтрагенты.контрагент = ТЧФевраль.Контрагент
И (ТЧФевраль.период = &ПериодФевраль)
Левое соединение Документ.МойДок.МояТЧ КАК ТЧМарт
ПО РазличныеКонтрагенты.контрагент = ТЧМарт.Контрагент
И (ТЧМарт.период = &ПериодМарт)
..


В этом коде есть одна ошибка - нет соединения по ссылке. Сейчас документ в базе один и дублей нет и запрос работает быстро.
Но стоит добавить в каждое соединение условие " И (ТЧмесяц.Ссылка = &Ссылка) "  как выполнение сильно запроса замедляется. и если первоначальный вариант выполняется за десятые доли секунды, то с соединением по ссылке - несколько десятков секунд.

Как добавить соединение по ссылке, чтобы запрос не тормозил? Использовать временные/вложенные таблицы на каждый месяц не хотелось бы, тогда запрос получится вообще монструозным..
1 Господин ПЖ
 
06.12.13
12:21
заменить на юнионы
2 RHCP
 
06.12.13
12:23
(1) это что?
3 МойКодУныл
 
06.12.13
12:24
(3) гугл переводчик говорит, что объединения. Но что имел ввиду(1) знает только он.
4 RHCP
 
06.12.13
12:32
ну что, никто не поможет?
И почему вообще соединение по ссылке так замедляет выборку?
5 Галахад
 
гуру
06.12.13
12:37
А не проще через
Выбор Когда период = &Январь Тогда сумма
иначе 0
?
6 RHCP
 
06.12.13
12:38
(5) вообще без соединений?
не взлетит. в исходной таблице 5 строк, мне нужно оставить 2
7 dmpl
 
06.12.13
12:38
(4) Тебе для чего? Если для отчета - то есть СКД...
8 Господин ПЖ
 
06.12.13
12:39
>Сейчас документ в базе один и дублей нет и запрос работает быстро

феерия...
9 RHCP
 
06.12.13
12:39
(7) мне для обработки, не отчет
10 МойКодУныл
 
06.12.13
12:40
(8) да, выборка презентабельная.
11 Feunoir
 
06.12.13
12:42
(9) Зачем для обработки именно такое представление? Может есть смысл пересмотреть дальнейший алгоритм.
12 dmpl
 
06.12.13
12:42
(9) Тогда проще программно преобразовать. Либо использовать ИТОГИ и обход по группировкам. Ну или 12 кусочков по 12 полей выбрать (на каждый месяц, с нулевым значением остальных полей), а потом сгруппировать.
13 Господин ПЖ
 
06.12.13
12:43
>вообще без соединений?

будет, но одно и более осмысленное
14 RHCP
 
06.12.13
12:44
(13) не пойму что ты предлагаешь
15 Господин ПЖ
 
06.12.13
12:45
>И почему вообще соединение по ссылке так замедляет выборку?

потому что написано через анус... оптимизатор просто корчится в судорогах наверное... сплошной nested loop
16 RHCP
 
06.12.13
12:46
(15) предложи рабочий вариант оптимизации
17 Господин ПЖ
 
06.12.13
12:46
тут даже юнионы не нужны... периоды разгрести через case и сгруппировать
18 Господин ПЖ
 
06.12.13
12:47
(16) уволить тебя нахер...
19 RHCP
 
06.12.13
12:49
(17) ну как вариант конешн..ща попробую
20 dmpl
 
06.12.13
12:49
(17) Через ВЫБОР строк в запросе больше будет ;)
21 RHCP
 
06.12.13
12:52
(20) однозначно.. потому что полей помесячных в реальном документе около 10..
22 Галахад
 
гуру
06.12.13
12:55
(6) Гм. А сгруппировать?
23 Zero on a dice
 
06.12.13
12:56
(21) а циклу какая разница?
24 GANR
 
06.12.13
12:57
(0) Соединение должно быть только одно по условию равенства контрагентов, а в колонках январь - декабрь должно быть

выбор когда месяц = Январь тогда сумма иначе 0 конец КАК Январь,
выбор когда месяц = Февраль тогда сумма иначе 0 конец КАК Февраль,
...
выбор когда месяц = Декабрь тогда сумма иначе 0 конец КАК Декабрь

Понятен смысл?
25 Жан Пердежон
 
06.12.13
13:01
тебе зачем эта таблица? если только в отчет вывести, то это не так делается...
26 WildSery
 
06.12.13
14:21
(0) Запрос в топку. Отчёт делается отчётником.
Ошибка? Это не ошибка, это системная функция.