|
Как в запросе выбрать ПЕРВЫЕ 1 для ЛЕВОЕ СОЕДИНЕНИЕ ? | ☑ | ||
---|---|---|---|---|
0
VladVons
12.12.20
✎
12:10
|
Нужно выбрать из документов РеализацияТоваровУслуг поля:
Номенклатура Цена ЦенаПриходная (из РегистрСведений.ЦеныНоменклатуры на дату документа) В запрос попадают избыточные данные из РегистрСведений.ЦеныНоменклатуры. Как подцепить только ОДНУ последнюю запись для нужной даты из РегистрСведений ? ВЫБРАТЬ ДокРеализацияТоваровУслуг.Номенклатура, ДокРеализацияТоваровУслуг.Цена, ЕСТЬNULL(РегЦеныНоменклатуры.Цена, 0) КАК ЦенаПриходная ИЗ Документ.РеализацияТоваровУслуг.Товары КАК ДокРеализацияТоваровУслуг ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК РегЦеныНоменклатуры ПО (РегЦеныНоменклатуры.Номенклатура = РеализацияТоваровУслуг.Номенклатура) И (РегЦеныНоменклатуры.Период <= РеализацияТоваровУслуг.Ссылка.Дата) И (РегЦеныНоменклатуры.ТипЦен = &МакрЦенаПриходная) |
|||
1
Вафель
12.12.20
✎
12:12
|
делай соединение Период=(выбрать первые период из рег где перилд < датадок)
|
|||
2
acht
12.12.20
✎
12:15
|
(0) google://СрезПоследних+на+каждую+дату
|
|||
3
Маленький Вопросик
12.12.20
✎
12:17
|
нет, используй Максимум в соединяемой таблице... или делай запрос в цикле )))))))
|
|||
4
acht
12.12.20
✎
12:20
|
(1) Ты про остальные измерения забыл. В результате получится коррелирующий подзапрос на каждую строчку и надо будет ооочень пристально смотреть на производительность.
Будет что-то страшноетипа левое соединие по (Номенклатура, Период, ТипЦен) в (выбрать Номенклатура, Максимум(Период), ТипЦен из ... где Номенклатура = ДокРеализацияТоваровУслуг.Номенклатура И ДокРеализацияТоваровУслуг.ТипЦен сгруппировать по ... ) |
|||
5
Вафель
12.12.20
✎
12:34
|
(4) предполагается что остальные измерения соответствуют документу
|
|||
6
Вафель
12.12.20
✎
12:35
|
никаких группировок не нужно
|
|||
7
acht
12.12.20
✎
13:10
|
А нуну
|
|||
8
VladVons
12.12.20
✎
17:16
|
(1) Пока сделал так.
Если есть замечания, то поправте и может кому пригодится. ВЫБРАТЬ ДокРеализацияТоваровУслуг.Номенклатура, ДокРеализацияТоваровУслуг.Цена, ЕСТЬNULL(РегЦеныНоменклатуры.Цена, 0) КАК ЦенаПриходная ИЗ Документ.РеализацияТоваровУслуг.Товары КАК ДокРеализацияТоваровУслуг ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК РегЦеныНоменклатуры ПО (РегЦеныНоменклатуры.Номенклатура = РеализацияТоваровУслуг.Номенклатура) И (РегЦеныНоменклатуры.ТипЦен = &МакрЦенаПриходная) И (РегЦеныНоменклатуры.Период В ( ВЫБРАТЬ ПЕРВЫЕ 1 Период ИЗ РегистрСведений.ЦеныНоменклатуры ГДЕ (Номенклатура = ДокРеализацияТоваровУслуг.Номенклатура) И (Период <= ДокРеализацияТоваровУслуг.Ссылка.Дата) И (ТипЦен = &МакрЦенаПрихода) УПОРЯДОЧИТЬ ПО Период УБЫВ ) ) |
|||
9
RomanYS
12.12.20
✎
17:23
|
(8) Коррелированный подзапрос, да ещё и в условиях соединения, да ещё и с трехэтажными конструкциями ДокРеализацияТоваровУслуг.Ссылка.Дата.
Отважно! Решение типа (2) гораздо безопаснее, и вероятно сильно быстрее на приличных объемах данных. |
|||
10
Said_We
12.12.20
✎
22:40
|
(9) ""Коррелированный подзапрос" - Отважно!" - в чем отважность? Работают они быстро. Если правильно написать.
Тут вместо "упорядочить по Период убыв" лучше использовать "Выбрать первые 1 Максимум(Период)" - тогда если такой запрос в СКД будет, то "тупить" не будет. |
|||
11
RomanYS
12.12.20
✎
22:48
|
(10) Конкретно вот это будет работать быстро!? "Быстро" - значит я не смогу написать запрос который будет в 2 раза быстрее на тестовом объеме данных.
На самом деле почти уверен, что при определенном объеме данных, запрос будет на порядки(в 10-100-1000 раз) медленнее. |
|||
12
RomanYS
12.12.20
✎
22:49
|
(10) СКД опускаем, говорим про "тупой" запрос. В СКД по идее эту задачу вообще по-другому можно решить
|
|||
13
Said_We
12.12.20
✎
22:59
|
(11) А кто мешает 1С поддерживать конструкцию "Select t.A as A, (select top 1 t1.a from t1 as t1 where .... order by ...) as AA from ... ?
Ещё и читабельно выглядит. |
|||
14
RomanYS
12.12.20
✎
23:05
|
(13) Без понятия. Это вопрос к 1С.
На практике (8) и тем более с правкой (10) будет работать неприемлимо медленно при чуть заметном объеме данных. |
|||
15
Said_We
16.12.20
✎
12:22
|
(8) В подзапрос с предварительным условием этот кусок запроса:
"ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК РегЦеныНоменклатуры ПО (РегЦеныНоменклатуры.Номенклатура = РеализацияТоваровУслуг.Номенклатура) И (РегЦеныНоменклатуры.ТипЦен = &МакрЦенаПриходная)" Номенклатуры в документе не бесчисленное количество, а весьма ограниченное. И цены нам необходимо брать только по ним. И Тип цен нам необходим только один. Поэтому проще в подзапрос засунуть выборку из РС с наложенными фильтрами. Из соединения условие на тип цен полностью переедет в подзапрос. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |