Имя: Пароль:
1C
1С v8
Левое соединение по ПОДОБНО
0 Sh18
 
24.09.21
09:38
Код товара состоит из основного кода и нескольких суффиксов. Задача: По списку основных кодов надо получить соответствующие товары:

ВЫБРАТЬ
    Тбл.КодТовара КАК ОсновнойКод,
    Тбл.ДлинаКода КАК ДлинаКода
ПОМЕСТИТЬ ВсеКоды
ИЗ
    &Тбл КАК Тбл
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
    Номенклатура.Ссылка КАК Номенклатура,
    ВсеКоды.ОсновнойКод КАК ОсновнойКод
ПОМЕСТИТЬ Ассортимент
ИЗ
    ВсеКоды КАК ВсеКоды
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
        ПО (Номенклатура.Код ПОДОБНО ВсеКоды.ОсновнойКод)
ГДЕ
    НЕ Номенклатура.Ссылка ЕСТЬ NULL

Проблема - очень медленно выполняется запрос, основных кодов может быть тысячи, а то и десятки тысяч
(ДлинаКода - пробовал через подстроку, что-то оно совсем не хочет сравнивать)
1 Sh18
 
24.09.21
09:39
(0) Да. % я вписал в конец основного кода. Можно не вписывать
2 mikecool
 
24.09.21
09:40
вынести основной код в реквизит и искать по нему
3 mikecool
 
24.09.21
09:40
+2 искать на равенство
4 ДенисЧ
 
24.09.21
09:40
" очень медленно выполняется запрос"
Это нормально для таких условий.
5 Sh18
 
24.09.21
10:00
Спасибо! Да, похоже, ничего другого не остается. Но была надежда, мало ли. Там фиговость, часть основных кодов приходят с первым суффиксом и интересуют только они. Но это немного, это можно и медленно обсчитать
Спасибо!
6 Шурик71
 
24.09.21
10:09
Насчет суффиксов..

Можешь попробовать что-то типа
ПО ((Номенклатура.Код >= ВсеКоды.ОсновнойКод)
И (Номенклатура.Код < (ВсеКоды.ОсновнойКод + "яяяяяя")))
7 patapum
 
24.09.21
10:18
(6) Подстрока(Номенклатура.Код, 1, &ДлинаОсновногоКода) = ВсеКоды.ОсновнойКод - не проще?
8 Шурик71
 
24.09.21
10:20
(7) Это только если длина основного кода фиксирована
9 acht
 
24.09.21
10:23
(1) % я вписал в конец основного кода
Добавь индекс по ОсновнойКод во времянке. Для условия "ааа подобно ббб%" индексы вполне работают. И у тебя там внутреннее соединение, не левое.
10 Sh18
 
24.09.21
10:46
(6) !!! 5 сек вместо 3 мин
(7) Длину основного кода надо явно ограничить в первом запросе, но она не фиксирована

В общем, работает больше-меньше!
11 Sh18
 
24.09.21
11:13
(9) Фактически, внутреннее. Но ВНУТРЕННЕЕ делает два прохода, и да, желательно индексы по обоим таблицам. Левое + не null работает за один проход и нужны индексы только для правой таблицы
12 acht
 
24.09.21
11:19
(11) > Левое + не null работает за один проход
У тебя условие накладывается не на соединение, а на результат соединения. Какой наъ "один проход"?
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn