|
ПОЛНОЕ СОЕДИНЕНИЕ в запросе | ☑ | ||
---|---|---|---|---|
0
Kalina
26.02.14
✎
14:52
|
Здравствуйте, 1с 8.2 КА
Нужно выбрать взаиморасчеты всех контрагентов за период Запрос.Текст = "ВЫБРАТЬ | Контрагенты.Ссылка, | Контрагенты.Наименование КАК Наименование, | Контрагенты.Родитель, | ВзаиморасчетыСКонтрагентами.СуммаУпр, | ВзаиморасчетыСКонтрагентами.Период КАК Период |ИЗ | Справочник.Контрагенты КАК Контрагенты | ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами | ПО Контрагенты.Ссылка = ВзаиморасчетыСКонтрагентами.Контрагент.Ссылка |ГДЕ | ВзаиморасчетыСКонтрагентами.Период <= &ДатаКон | И ВзаиморасчетыСКонтрагентами.Период >= &ДатаНач | |УПОРЯДОЧИТЬ ПО | Наименование, | Период"; Выводит только тех контрагентов - по которым была торговля Вроде ПОЛНОЕ СОЕДИНЕНИЕ со Справочником Контрагентов должно выводить всех Контрагентов??? В чем прикол ??? |
|||
1
H A D G E H O G s
26.02.14
✎
14:53
|
|ГДЕ
| ВзаиморасчетыСКонтрагентами.Период <= &ДатаКон | И ВзаиморасчетыСКонтрагентами.Период >= &ДатаНач |
|||
2
H A D G E H O G s
26.02.14
✎
14:53
|
здесь
|
|||
3
H A D G E H O G s
26.02.14
✎
14:53
|
| ПО Контрагенты.Ссылка = ВзаиморасчетыСКонтрагентами.Контрагент.Ссылка
заменить на | ПО Контрагенты.Ссылка = ВзаиморасчетыСКонтрагентами.Контрагент |
|||
4
Fram
26.02.14
✎
14:54
|
Лучше Контрагенты.Ссылка = ВзаиморасчетыСКонтрагентами.Контрагент.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка
|
|||
5
Fram
26.02.14
✎
14:54
|
так он вернее
|
|||
6
Fram
26.02.14
✎
14:54
|
оно
|
|||
7
shuhard
26.02.14
✎
14:55
|
(0)[РегистрНакопления.ВзаиморасчетыСКонтрагентами]
заменить на обороты |
|||
8
Maxus43
26.02.14
✎
14:57
|
вместо
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами надо ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентамиОбороты(&Нач, &Кон) |
|||
9
Ёпрст
26.02.14
✎
14:57
|
ГДЕ заменить на И ..
|
|||
10
Armando
26.02.14
✎
15:04
|
Полное соединение оно такое полное...
Зачем здесь оно? |
|||
11
Feunoir
26.02.14
✎
15:09
|
(0) Фильтруй выборку по регистру до связывания со справочником. Или во временную таблицу, или в подзапросе. Потом уже с готовой таблицей соединяй. И полное соединение здесь не нужно. Достаточно левого (или правого), смотря что с чем будешь соединять.
|
|||
12
Speshuric
26.02.14
✎
15:23
|
ВЫБРАТЬ
Контрагенты.Ссылка, Контрагенты.Наименование, Контрагенты.Родитель, ВзаиморасчетыСКонтрагентами.СуммаУпр, ВзаиморасчетыСКонтрагентами.Период ИЗ Справочник.Контрагенты КАК Контрагенты ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами ПО Контрагенты.Ссылка = ВзаиморасчетыСКонтрагентами.Контрагент И ВзаиморасчетыСКонтрагентами.Период МЕЖДУ &ДатаНач И &ДатаКон УПОРЯДОЧИТЬ ПО Наименование, Период |
|||
13
shuhard
26.02.14
✎
15:33
|
(12)[ И ВзаиморасчетыСКонтрагентами.Период МЕЖДУ &ДатаНач И &ДатаКон ]
понизит скорость часто катастрофически |
|||
14
Kalina
26.02.14
✎
15:36
|
(12) 5 баллов - Спасибо Великий Мастер - Заработало
Всем остальным тоже спасибо, буду разбираться дальше С Уважением Kalina |
|||
15
Maxus43
26.02.14
✎
15:38
|
(14) вирт таблицу Обороты используй, остальное некрасиво и неправильно.
Если в период у тебя было 2 движения - будет 2 строчки. Это к примеру о неправильности, про другие косяки уже намекали |
|||
16
Kalina
26.02.14
✎
15:46
|
(15) А мне и надо все движения, а не голый оборот, а про другие косяки можно поподробнее ???
|
|||
17
Maxus43
26.02.14
✎
15:48
|
(16) а, сори, период выбран, не заметил.
Но с вирт таблицей Обороты результат не изменится, всё будет так же хорошо другие косяки см (13) |
|||
18
Speshuric
26.02.14
✎
16:04
|
(13) В каком случае скорость понизится? А то в плане запросов MS SQL between в общем-то в >= <= и преобразуется.
(16) Если бы это был универсальный отчет для любой конфигурации, то еще стоило бы "Активность" учесть. В КА вроде штатно записи без активности не делаются. Виртуальная таблица, если нужны именно все движения, не нужна. |
|||
19
Speshuric
26.02.14
✎
16:07
|
(13)
Пруф: SQL: set statistics profile on select * from dbo._AccumRgТвойРегистр where _Period between '20131201' and '20131206' set statistics profile off В результате видно: "WHERE:([ТвояБД].[dbo].[_AccumRg13101].[_Period]>='2013-12-01 00:00:00.000' AND [ТвояБД].[dbo].[_AccumRg13101].[_Period]<='2013-12-06 00:00:00.000' |
|||
20
Speshuric
26.02.14
✎
16:08
|
(19) Причем этот WHERE в условии предиката на кластеризованный индекс.
|
|||
21
Maxus43
26.02.14
✎
16:11
|
(19) у тебя сферический запрос в вакууме, в (12) условие засунуто в Соединение, и не факт что оно хорошо будет транслировано сервером 1с в скуль, надо смотреть конечно.
По логике больше подходит вирт таблица оборотов РН |
|||
22
Speshuric
26.02.14
✎
16:18
|
(21) Блин, ну могу из ТЖ выдернуть. Как будет транслировано - вполне факт, тут ничего другого не изобрести.
Таблица оборотов судя по "надо все движения" не подходит: зачем заставлять 1С формировать какой-то дикий подзапрос с группировками и having, если задача просто вывести движения? Например, таблица оборотов "схлопнет" сторнирующиеся движения в одном регистраторе. Хотя, конечно, задача скорее всего противоречит логике учета КА, потому что эта логика не предполагает, что кто-то анализирует отдельные движения. |
|||
23
БибиГон
26.02.14
✎
16:21
|
(22) Таблица оборотов вроде больше к этому приспособлена. А движения можно выдернуть и из таблицы оборотов если период по сек или запись
|
|||
24
Speshuric
26.02.14
✎
16:52
|
(23)(21)(15)
Коллеги! Почему вы считаете что в данном случае от таблицы оборотов будет польза? Если считать, что задача поставлена именно вывести суммы движений, то таблица оборотов тут и даром не нужна. Без оборотов запрос на стороне SQL выглядит просто и красиво (таблицы не из типовой, но всё, кроме номеров таблиц будет аналогично): SELECT T1._IDRRef, T1._Description, T1._ParentIDRRef, T2._Period, T2._Fld13903 FROM _Reference166 T1 WITH(NOLOCK) LEFT OUTER JOIN _AccumRg13898 T2 WITH(NOLOCK) ON (((T2._Fld13900RRef = T1._IDRRef) AND ((T2._Period >= P1) AND (T2._Period <= @P2)))) AND (T2._Fld676 = @P3) Если конфа с разделителем, то еще и разделитель: WHERE (T1._Fld676 = @P4) Для таблицы оборотов будет следующее: 1. Получаются параметры регистра. Не знаю зачем, но получаются (пример из разделенной конфигурации, поэтому есть T1._Fld676 = P1): SELECT MIN(T1._Period), MIN(T1._UseTotals), MIN(T1._ActualPeriod), MAX(T1._UseSplitter), MIN(T1._MinPeriod) FROM _AccumRgOpt14012 T1 WITH(NOLOCK) WHERE ((T1._Fld676 = P1)) AND (T1._RegID = @P2)',N'P1 numeric(10),@P2 varbinary(8000) 2. Сам запрос сложнее и содержит лишние cast, group by и having: SELECT T1._IDRRef, T1._Description, T1._ParentIDRRef, T2.Period_, T2.Fld13903Turnover_ FROM _Reference166 T1 WITH(NOLOCK) LEFT OUTER JOIN (SELECT T3._Period AS Period_, T3._RecorderTRef AS RecorderTRef, T3._RecorderRRef AS RecorderRRef, T3._LineNo AS LineNo_, T3._Fld13900RRef AS Fld13900RRef, CAST(SUM(CASE WHEN T3._RecordKind = 0.0 THEN T3._Fld13903 ELSE -T3._Fld13903 END) AS NUMERIC(24, 8)) AS Fld13903Turnover_ FROM _AccumRg13898 T3 WITH(NOLOCK) WHERE ((T3._Fld676 = P1)) AND (T3._Period >= @P2 AND T3._Period <= @P3 AND T3._Active = 0x01) GROUP BY T3._Period, T3._RecorderTRef, T3._RecorderRRef, T3._LineNo, T3._Fld13900RRef HAVING (CAST(SUM(CASE WHEN T3._RecordKind = @P4 THEN T3._Fld13903 ELSE -T3._Fld13903 END) AS NUMERIC(24, 8))) <> @P5) T2 ON (T2.Fld13900RRef = T1._IDRRef) WHERE (T1._Fld676 = @P6) Причем (что логично) запросы почти-почти одинаковы по количеству логических чтений, но запрос с таблицей регистра чуть меньше по времени CPU и общему по времени выполнения. Но вся эта разница всё равно лишь несколько мс. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |