Форум OlegON > Программы и оборудование для автоматизации торговли > Системы автоматизации торговли > Супермаг Плюс (Супермаг 2000)

Список карточек заданных групп классификатора через запрос : Супермаг Плюс (Супермаг 2000)

12.11.2024 10:16


11.10.2024 11:48
Ленивый в пятницу мозг просит совета у коллективного разума.

Список карточек заданной группы классификатора.

SQL код:
select c.article from supermag.smcard c, Supermag.SACardClass, Supermag.SACardClass R1
               where Supermag.SACardClass.ID = c.IDClass
                and c.IDClass=R1.ID
                and R1.Tree like (select saa.tree from sacardclass saa where id in (380.0))||'%'; 
А если по нескольким группам.

SQL код:
and R1.Tree like (select saa.tree from sacardclass saa where id in (379.0,380.0))||'%'; 
ORA-01427: single-row subquery returns more than one row


Как написать?
11.10.2024 12:28
У тебя не заданная группа классификатора, а несколько, 379 и 380, потому и ошибка. Заданная - это "where id=379", откуда у тебя там .0 взялся суффиксом вообще не понимаю.
Сделай = и substr, как я помню, в штатных функциях Супермага такое уже что-то есть. Или можешь exists, например, так (не проверял, но общий смысл такой)

SQL код:
SELECT c.article
FROM supermag.smcard c
JOIN supermag.sacardclass ON supermag.sacardclass.ID = c.IDClass
JOIN supermag.sacardclass R1 ON c.idclass = R1.ID
WHERE EXISTS (
    SELECT 1
    FROM supermag.sacardclass saa
    WHERE saa.id IN (380, 390)
      AND R1.tree LIKE saa.tree || '%'
); 
14.10.2024 08:27
Наоборот же обычно?
SQL код:
select saa.id from sacardclass saa where saa.tree Like (380.0||'%') 
Tree - видимый код дерева, id - уникальный код узла.
04.11.2024 09:45
SQL код:
WHERE saa.id IN (380, 390)
      AND R1.tree LIKE saa.tree || '%' 
Тут как раз задача вытащить TREE двух узлов по их ID, и на них (а не на один узел) сделать LIKE.

Очевидное решение -- динамический SQL -- добавлять в текст запроса ' or T.tree like ... ' столько раз, сколько выбрано узлов классификатора.

Но, возможно, есть более изящное решение. Опробую ваше, спасибо.

Правка: DMaslov, 04.11.2024 09:53
06.11.2024 23:51
Как вариант. Также можно a вытащить в with.
SQL код:
SELECT c.* 
  FROM supermag.smcard c,
       ( SELECT sc1.id
           FROM supermag.sacardclass sc, supermag.sacardclass sc1 
          WHERE sc.id IN (380, 390)
            AND sc1.tree like sc.tree||'%' ) a
 WHERE c.idclass=a.id; 
Часовой пояс GMT +3, время: 10:16.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.