| 
    
        
     
     | 
    
  | 
Выбрать запросом верхний уровень группировки для массива номенклатуры | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        Valkyrie    
     28.04.20 
            ✎
    12:11 
 | 
         
        Всем здоровья! Что-то туплю с запросом. Есть массив номенклатуры, нужно получить рядом с каждой ее верхний уровень иерархии. С одним элементом понятно, а с массивом?
 
        Делаю так для одного элемента: ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Ссылка = &Ссылка ИТОГИ ПО Ссылка ТОЛЬКО ИЕРАРХИЯ А если массив? Нужно получить: Номенклатура1 - Группа1 Номенклатура2 - Группа2 Номенклатура3 - Группа1  | 
|||
| 
    1
    
        Ёпрст    
     гуру 
    28.04.20 
            ✎
    12:15 
 | 
         
        (0) это тест на собеседовании ?     
         | 
|||
| 
    2
    
        Гипервизор    
     28.04.20 
            ✎
    12:16 
 | 
         
        Что значит верхний уровень? Верхний уровень у всех элементов один.     
         | 
|||
| 
    3
    
        Василий Алибабаевич    
     28.04.20 
            ✎
    12:18 
 | 
         
        (2) Ни в коем случае. Есть просто верхний, а есть САМЫЙ верхний...
 
        Ну как в анекдоте про технику безопасности : "Синюю краску пить нельзя!!! А зеленую - пить нельзя НИКОГДА!!!"  | 
|||
| 
    4
    
        Fragster    
     гуру 
    28.04.20 
            ✎
    12:19 
 | 
         
        в общем случае запросом никак, при ограничении иерархии возможно через ЕстьNULL(Ссылка.Родитель.Родитель.Родитель....., ЕстьNULL(Ссылка.Родитель.Родитель.Родитель....., ЕстьNULL()))     
         | 
|||
| 
    5
    
        Fragster    
     гуру 
    28.04.20 
            ✎
    12:20 
 | 
         
        или можно рядом в РС хранить nested set + level и выбирать через простое условие Лев меньше и Прав больше и Уровень = 1     
         | 
|||
| 
    6
    
        Valkyrie    
     28.04.20 
            ✎
    12:20 
 | 
         
        (1) Нет, оптимизирую код. Сейчас делается в цикле по каждому элементу массива запрос. 
 
        (2) Запрос выше выдает иерархию элементов. Например, структура справочника Группа1/Группа2/НашЭлемент. Запрос выдает эти значения построчно: Группа1 Группа2 НашЭлемент Нужна Группа1 - НашЭлемент  | 
|||
| 
    7
    
        Fragster    
     гуру 
    28.04.20 
            ✎
    12:24 
 | 
         
        еще можно в РС хранить верхнего родителя и в подписке обновлять.     
         | 
|||
| 
    8
    
        Valkyrie    
     28.04.20 
            ✎
    12:24 
 | 
         
        (4) (5) Ясно, жаль. Хотелось красоты) Спасибо!     
         | 
|||
| 
    9
    
        Valkyrie    
     28.04.20 
            ✎
    12:24 
 | 
         
        (7) Железобетонный вариант :D     
         | 
|||
| 
    10
    
        МихаилМ    
     28.04.20 
            ✎
    12:31 
 | 
         
        у эльдаровича есть красивое решение через временые таблицы     
         | 
|||
| 
    11
    
        Fragster    
     гуру 
    28.04.20 
            ✎
    12:41 
 | 
         
        (10) не красивое и не производительное.     
         | 
|||
| 
    12
    
        fisher    
     28.04.20 
            ✎
    13:04 
 | 
         
        (11) Концептуально - красивое.     
         | 
|||
| 
    13
    
        fisher    
     28.04.20 
            ✎
    13:07 
 | 
         
        (11) Да и если иерархия сложная с длинными путями - то очень эффективное для алгоритмов покрывающих большую часть справочника.     
         | 
|||
| 
    14
    
        Cyberhawk    
     28.04.20 
            ✎
    13:26 
 | 
         
        Что-то (4) явно брешет, что запросом никак     
         | 
|||
| 
    15
    
        Fragster    
     гуру 
    28.04.20 
            ✎
    13:58 
 | 
         
        (14) ой ли?     
         | 
|||
| 
    16
    
        Fragster    
     гуру 
    28.04.20 
            ✎
    14:01 
 | 
         
        если рядом положить данные для nested set то и соединение по В Иерархии можно, и верхнего родителя и хоть черта лысого. а в стандартном 1совском adjastent list нифига нет общего случая, разве что на расширенном (t-/pl-)sql, а не на 1совском обрубке.     
         | 
|||
| 
    17
    
        dezss    
     28.04.20 
            ✎
    14:09 
 | 
         
        (11) Да нормальное у него решение.
 
        И довольно неплохо отрабатывает. Просто немного его подправить под задачу. (0) У меня около года назад был такой вопрос. Решение с транзитивным замыканием помогло. Выбирает оно, конечно, много ненужных данных, но в последнем запросом ограничиваешь выборку и все есть. Производительность не самая высокая, так что нужно сравнивать твое решение с циклом и замыкание по быстродействию. При малом размере массива будет довольно медленно, но все надо проверять.  | 
|||
| 
    18
    
        fisher    
     28.04.20 
            ✎
    14:15 
 | 
         
        (15) Если знать максимальную глубину, то никакой проблемы сделать одним запросом. А если использовать вариант Ильдаровича - то можно даже и не знать. Так как там экспоненциальная зависимость и можно использовать решение, которое заведомо перекроет все разумные практические варианты.     
         | 
|||
| 
    19
    
        Fragster    
     гуру 
    28.04.20 
            ✎
    14:17 
 | 
         
        (18) "если знать максимальную глубину", то нужно сначала её определить, а потом сделать динамический текст запроса и его выполнить. что в этом элегантного - хз.     
         | 
|||
| 
    20
    
        fisher    
     28.04.20 
            ✎
    14:25 
 | 
         
        (19) Максимальную глубину можно выставить в метаданных и оттуда брать. На практике для конкретных справочников всегда существуют разумные пределы. А одним пакетом - повышает эффективность.
 
        А прям элегантных решений этой задачи не существует в природе. Ну или делись.  | 
|||
| 
    21
    
        Fragster    
     гуру 
    28.04.20 
            ✎
    14:29 
 | 
         
        (20) прям элегантное - положить рядом что-то, что для этого предназначено. materialized path в запросе 1с, к сожалению, бесполезен, nested set может помочь. Но это требует дополнительных подписок, хоть и позволяет кучу всего. в данном конкретном случае проще всего (7), если прям нешуточная борьба за производительность идет.     
         | 
|||
| 
    22
    
        fisher    
     28.04.20 
            ✎
    14:35 
 | 
         
        (21) В каком виде положить? Комбинации всех путей, что ли, хранить?
 
        Читать-то элегантно, а вот обновлять - как-то не очень. Эдак перенос группы может вести к перезаписи половины регистра.  | 
|||
| 
    23
    
        dezss    
     28.04.20 
            ✎
    14:40 
 | 
         
        (22) +100500
 
        А вообще, тут вопрос только в том, что нам нужно. Производительность или простота.  | 
|||
| 
    24
    
        fisher    
     28.04.20 
            ✎
    14:50 
 | 
         
        (21) А самая смешная фигня получится - когда для ускорения пересчета nested sets ты начнешь использовать вариант Ильдаровича :)     
         | 
|||
| 
    25
    
        Fragster    
     гуру 
    28.04.20 
            ✎
    15:21 
 | 
         
        (22)
 
        >Комбинации всех путей, что ли, хранить? nested set работает не так Вообще я не говорю, что минусов нет. да, пересчеты могут быть всей таблицы при изменении иерархии. на sql с его update еще куда ни шло (по количеству запросов, по строкам все равно швах). У себя использовал для хранения альтернативных иерархий с фоновым обновлением. и только для групп, на элементы справочника не распространял. Тогда самих строк у иерархии сильно меньше получается. Зато к СКД прикручивается замечательно, и соединения всякие работают. Пересчета nested set однократно-рекурсивным проходом полной выборки делал. с перезаписью только нужных данных.  | 
|||
| 
    26
    
        fisher    
     28.04.20 
            ✎
    15:36 
 | 
         
        (25) Это было по (7) уточнение. А nested set - пичалька с точки зрения пересчета. Печальнее остальных вариантов. Читать - да, красиво.     
         | 
|||
| 
    27
    
        rsv    
     28.04.20 
            ✎
    15:45 
 | 
         
        (0) а что за субд ? Может какой нить коннект бай приор найдётся ?     
         | 
|||
| 
    28
    
        АнализДанных    
     28.04.20 
            ✎
    20:02 
 | 
         
        (0) На инфостарте есть статья "транзитивное замыкание", там рассмотрен пример того, как получить родителя верхнего уровня запросом. Посмотри, довольно интересное решение, а главное очень быстро отрабатывает.     
         | 
|||
| 
    29
    
        Ram_zes    
     28.04.20 
            ✎
    20:48 
 | 
         
        (0) Вали через 
 
        Выбор когда Номенклатура.Родитель = хыхыхы Тогда и погнали  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |