|
Левое соединение по ПОДОБНО |
☑ |
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 работает за один проход
У тебя условие накладывается не на соединение, а на результат соединения. Какой наъ "один проход"?
|
|
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший