v7: 1SQLite: Помогите с запросом к справочнику товаров #778978


#0 by PVL09
Ув. господа! Нужна ваша помощь с запросом к справочнику товаров. Суть запроса - получить список товаров, удовлетворяющего некоторым условиям: 1) Отбор по группам товаров - необязательное, группа одна или несколько, уровни могут быть разные, 1-2 по иерархии; 2) Отбор по реквизиту группы ("Куратор","Справочник.Кураторы",необязательный, один или несколько), заполнен только на произвольном уровне (1-3), но нижележащие уровни должны входить в выборку; 3) Отбор по реквизиту элемента ("Категория", "Справочник.Категории", необязательный), заполнен у всех товаров.
#1 by PVL09
Накидал запрос, но как-то он криво работает - при исключении одного из критериев зависает до бесконечности. Вот текст запроса:     Таб.code,     ,CASE     WHEN Тов3.ID<>'     0   ' THEN Тов3.ID     WHEN Тов2.ID<>'     0   ' THEN Тов2.ID     WHEN Тов1.ID<>'     0   ' THEN Тов1.ID     left join [Справочник.Товары] Тов1 on (Тов1.PARENTEXT='     3   ') and (Тов1.ParentID = СпрТов.ID) and (Тов1.IsFolder = 1)     left join [Справочник.Товары] Тов2 on (Тов2.PARENTEXT='     3   ') and (Тов2.ParentID = Тов1.ID) and (Тов2.IsFolder = 1)     left join [Справочник.Товары] Тов3 on (Тов3.PARENTEXT='     3   ') and (Тов3.ParentID = Тов2.ID) and (Тов3.IsFolder = 1) and (СпрТов.ID IN (SELECT Val FROM ТабТов)) and (СпрТов.Куратор IN (SELECT Val FROM ТабКур))       ORDER by 1) as Таб on Таб.ОбъектГ=СпрТ.ParentID WHERE (СпрТ.PARENTEXT='     3   ') and (СпрТ.IsFolder = 2)  and (СпрТ.Категория IN (SELECT Val FROM ТабКат))
#2 by PVL09
вот что выдает отладка: , idx_ID char collate _1C default null , idx_PARENTEXT_PARENTID_ISFOLDER_CODE char collate _1C default null , idx_PARENTEXT_PARENTID_ISFOLDER_DESCR char collate _1C default null , idx_CODE char collate _1C default null , idx_DESCR char collate _1C default null , idx_Артикул char collate _1C default null , idx_PARENTEXT_PARENTID_ISFOLDER_Артикул char collate _1C default null , idx_ЕдиницаИзмерения_DESCR char collate _1C default null , idx_PARENTEXT_PARENTID_ISFOLDER_ЕдиницаИзмерения_DESCR char collate _1C default null , idx_Категория_DESCR char collate _1C default null , idx_PARENTEXT_PARENTID_ISFOLDER_Категория_DESCR char collate _1C default null , idx_ОЕМ char collate _1C default null , idx_PARENTEXT_PARENTID_ISFOLDER_ОЕМ char collate _1C default null , idx_АМатрица_DESCR char collate _1C default null , idx_PARENTEXT_PARENTID_ISFOLDER_АМатрица_DESCR char collate _1C default null , idx_Куратор_DESCR char collate _1C default null , idx_PARENTEXT_PARENTID_ISFOLDER_Куратор_DESCR char collate _1C default null ) szName SC16 Подбор индекса для таблицы SC16 :     Выбран индекс PCODE: PARENTEXT+PARENTID+STR(ISFOLDER,1)+UPPER(CODE) szName SC16 Подбор индекса для таблицы SC16 :     Выбран индекс PCODE: PARENTEXT+PARENTID+STR(ISFOLDER,1)+UPPER(CODE) szName SC16 Подбор индекса для таблицы SC16 : szName SC16 Подбор индекса для таблицы SC16 : szName SC16 Подбор индекса для таблицы SC16 :     Выбран индекс PCODE: PARENTEXT+PARENTID+STR(ISFOLDER,1)+UPPER(CODE) szName SC16 Подбор индекса для таблицы SC16 :     Выбран индекс PCODE: PARENTEXT+PARENTID+STR(ISFOLDER,1)+UPPER(CODE) szName SC16 Подбор индекса для таблицы SC16 :     Выбран индекс PCODE: PARENTEXT+PARENTID+STR(ISFOLDER,1)+UPPER(CODE) 1SQLite: 154.48 сек.
#3 by Ёпрст
читай последние посты и.. переписывай запрос
#4 by Ёпрст
заместо case лучше писать coalesce(Тов3.ID, Тов2.ID, Тов1.ID,СпрТов.ID) ОбъектГ и сравнивать с пустымИД - не верно, там null будет, если че, а не пустой ИД.
#5 by Ёпрст
писать Тов1.PARENTEXT='     3   ') - моветон, пиши по-русски: Тов1.PARENTEXT=:ВыбВладелец
#6 by Ёпрст
ORDER by 1 - это выкинь
#7 by Ёпрст
На счет куратора - у тебя опять неверно, это реквизит группы
#8 by Ёпрст
вот эти условия: and (Тов1.IsFolder = 1)  - не верные. Так ты получаешь только группы, а на все элементы унутри групп кладешь с прибором
#9 by PVL09
Не успеваю читать.. принципиально это ничего не поменяет же, владелец не меняется.. сначала получаю группы а потом к ним цепляю товары.. так не канает?
#10 by Ёпрст
канает, не заметил, что ты иннер джоин потом лепишь по as Таб on Таб.ОбъектГ=СпрТ.ParentID
#11 by Ёпрст
всё равно, я бы всё переписал по-другому, с учетом .
#12 by Ёпрст
но у тебя основная ошибка - case твой
#13 by PVL09
Здесь я полностью согласен! Сейчас пробую..
#14 by PVL09
Как бы ты переделал? В любом случае нужно сначала сделать отбор по группам, а потом к ним товары цеплять.. Или есть другие варианты? А ИндексированнаяТаблица никак здесь не поможет?
#15 by PVL09
Что-то опять не удалось УложитьОбъекты..
#16 by Djelf
Ага, в верно замечено. Куратор - реквизит группы. Логика с кураторами то какая? Если в группе1 Иванов, а в подчиненной группе2 Петров, то при выборе Иванова что должно выводится? Группа1 или еще и Группа2
#17 by PVL09
Куратор ставится на 2 или 3 (реже) уровнях, и они не пересекаются. Это привязка групп товаров к менеджеру закупок
#19 by PVL09
Спасибо! Непонятно как, но работает! И очень быстро!
#20 by Djelf
Кури cte! По этим ссылка нормально объясняется: То что там про cte в mssql и postgesql - не существенно.
#21 by Djelf
Если будут тормоза при накладывании условий по IN пробуй заменить WHERE Таб.ID IN (ЧтоТоТам) на WHERE +Таб.ID IN (ЧтоТоТам) Это отключит оптимизацию по IN, которая иногда в sqlite дурит по страшному.
#22 by orefkov
а 1sqlite умеет cte? Ошеломлен, если честно.
#23 by orefkov
+ Прочитал другую ветку, вопрос снимаю, равно как и шляпу :) Отличная работа.
#24 by Djelf
Халтура, Шеф! Халтура! Была бы отличная, я бы разобрался как индекс по двум полям ставить... Буду думать 1sqlite дальше, возможно и достигну следующий степени просветления.
#25 by PVL09
, Спасибо вам, парни! Да пребудет с вами сила просветления! ;-)
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С