|
Выбрать запросом верхний уровень группировки для массива номенклатуры | ☑ | ||
---|---|---|---|---|
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) Вали через
Выбор когда Номенклатура.Родитель = хыхыхы Тогда и погнали |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |