Имя: Пароль:
1C
1C 7.7
v7: Помощь с запросом SQL. Логика запрос
0 КонечноДа
 
29.11.15
17:56
Нужно отбирать номенклатуру по списку значений свойств (Свойства номенклатуры). Пробовал писать условия так:

    ТекстЗапроса = "
    |SELECT
    | Номенклатура.ID [Номенклатура $Справочник.Номенклатура]
    |FROM
    | $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
    | INNER JOIN $Справочник.СвойстваНоменклатуры AS СвойстваНоменклатуры With (NOLOCK) ON Номенклатура.ID = СвойстваНоменклатуры.PARENTEXT
    |WHERE
    | (Номенклатура.ID IN (SELECT val FROM #Группа))
    |AND ($СвойстваНоменклатуры.ЗначениеСвойства = :ФильтрИ1)
    |AND ($СвойстваНоменклатуры.ЗначениеСвойства = :ФильтрИ2)";    

_гЗапрос.УстановитьТекстовыйПараметр("ФильтрИ1",ТекЗначениеСвойстваИ);    
_гЗапрос.УстановитьТекстовыйПараметр("ФильтрИ2",ТекЗначениеСвойстваИ);    

запрос не возвращает товары. Оно и понятно, sql думает что я проверяю принадлежность к обоим фильтрам у одного и того же свойства.

и так:

    ТекстЗапроса = "
    |SELECT
    | Номенклатура.ID [Номенклатура $Справочник.Номенклатура]
    |FROM
    | $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
    | INNER JOIN $Справочник.СвойстваНоменклатуры AS СвойстваНоменклатуры With (NOLOCK) ON Номенклатура.ID = СвойстваНоменклатуры.PARENTEXT
    |WHERE
    | (Номенклатура.ID IN (SELECT val FROM #Группа))
    |"
    ;

    Если списХарактеристик.РазмерСписка()>0 Тогда
        _гЗапрос.УложитьСписокОбъектов(списХарактеристик, "#qqq", "ЗначенияСвойств");
        ТекстЗапроса=ТекстЗапроса+" AND ($СвойстваНоменклатуры.ЗначениеСвойства = (SELECT val FROM #qqq))";
    КонецЕсли;

тогда запрос возвращает товары если хоть одно из условий соответствует фильтру. А мне нужно, чтоб если заданы, например, две характеристики, то возвращались только ТЕ ТОВАРЫ, у которых ДВЕ характеристики соответствуют выбранным свойствам. Мне кажется тут с логикой у меня что-то не то, но что делать то?

P.S. можно, конечно, сделать прямой запрос в рекурсии, но это зло ))
2 hhhh
 
29.11.15
20:33
ну тупо делаешь два inner join. Чего ты паришься?
3 ADirks
 
30.11.15
07:53
так что ли ?

    |SELECT
    | Номенклатура.ID [Номенклатура $Справочник.Номенклатура]
    |FROM
    | $Справочник.Номенклатура AS Номенклатура With (NOLOCK)
    | INNER JOIN $Справочник.СвойстваНоменклатуры AS СвойстваНоменклатуры With (NOLOCK) ON Номенклатура.ID = СвойстваНоменклатуры.PARENTEXT
    |WHERE
    | (Номенклатура.ID IN (SELECT val FROM #Группа))
    |AND $СвойстваНоменклатуры.ЗначениеСвойства In (:ФильтрИ1, :ФильтрИ2)
4 hhhh
 
30.11.15
09:24
| INNER JOIN $Справочник.СвойстваНоменклатуры AS СвойстваНоменклатуры1 With (NOLOCK) ON Номенклатура.ID = СвойстваНоменклатуры1.PARENTEXT
    |AND
    | (Номенклатура.ID IN (SELECT val FROM #Группа))
     |AND $СвойстваНоменклатуры1.ЗначениеСвойства In (:ФильтрИ1)
| INNER JOIN $Справочник.СвойстваНоменклатуры AS СвойстваНоменклатуры2 With (NOLOCK) ON Номенклатура.ID = СвойстваНоменклатуры2.PARENTEXT
     |AND $СвойстваНоменклатуры2.ЗначениеСвойства In (:ФильтрИ2)
5 hhhh
 
30.11.15
09:25
| INNER JOIN $Справочник.СвойстваНоменклатуры AS СвойстваНоменклатуры1 With (NOLOCK) ON Номенклатура.ID = СвойстваНоменклатуры1.PARENTEXT
    |AND
    | (Номенклатура.ID IN (SELECT val FROM #Группа))
     |AND $СвойстваНоменклатуры1.ЗначениеСвойства In (:ФильтрИ1)
| INNER JOIN $Справочник.СвойстваНоменклатуры AS СвойстваНоменклатуры2 With (NOLOCK) ON Номенклатура.ID = СвойстваНоменклатуры2.PARENTEXT
     |AND
    | (Номенклатура.ID IN (SELECT val FROM #Группа))    |AND $СвойстваНоменклатуры2.ЗначениеСвойства In (:ФильтрИ2)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший