|
Изъять дубли из дерева
|
|||
---|---|---|---|
#18+
Добрый день! Есть две таблицы: Код: sql 1. 2. 3. 4.
и Код: sql 1. 2. 3. 4.
Задача, в общем-то, проста: нужно вытащить иерархию подчиненных ID для конкретного MASTER_ID. В общем случае решается через ХП и рекурсию. Но есть один нюанс: данные заполнены так, что один и тот же SUBJECT_ID может присутствовать и в таблице SUBJECTS, и в таблице TREE в виде SUBJECT_B_ID, SUBJECT_A_ID для которого также содержится в SUBJECTS. Пример: Код: sql 1. 2. 3. 4. 5. 6.
В простом варианте получаем ветви 1-2-3-4 и 3-4. Задача состоит в том, чтобы не дублировать то, что уже вошло как фрагмент, т.е. показать только ветвь 1-2-3-4. Формализуя задачу, получается, что нужно убрать те узлы верхнего уровня, которые уже входят в дерево, как узлы более низких уровней. В рамках рекурсивной ХП сделать этого без промежуточной таблицы не получается, поскольку дерево еще не собрано, да и фрагмент может быть сформирован раньше, чем полная ветвь. Быть может, есть другой подход? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 10:51 |
|
Изъять дубли из дерева
|
|||
---|---|---|---|
#18+
Kirill RazuvaevБыть может, есть другой подход? Либо временная таблица, либо проверка на лету снизу вверх. Второе с нужными индексами не сильно напряжет субд. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 11:23 |
|
Изъять дубли из дерева
|
|||
---|---|---|---|
#18+
wadmanлибо проверка на лету снизу вверх Пока не могу придумать, как именно проверять внутри рекурсии. Или накладывать его уже после нее? Просто так убирать третью строку в тестовом наборе при наличии пятой - неверно, поскольку возможен вариант, что ветвь, к которой относится эта часть, не адресуется выше к нужному master_id. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 11:49 |
|
Изъять дубли из дерева
|
|||
---|---|---|---|
#18+
Kirill RazuvaevПока не могу придумать, как именно проверять внутри рекурсии. Обратная рекурсия: 3-2-1 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 11:55 |
|
Изъять дубли из дерева
|
|||
---|---|---|---|
#18+
wadmanОбратная рекурсия: 3-2-1Получается, это нужно делать после формирования дерева и за один проход по набору этого не сделать, т.е. опять к временной таблице приезжаем... Получается, нужно изъять, все записи с ID=N с уровнем вложенности меньшим максимального имеющегося для ID=N. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 12:20 |
|
Изъять дубли из дерева
|
|||
---|---|---|---|
#18+
wadmanОбратная рекурсия: 3-2-1Только вот как это реализовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 16:35 |
|
Изъять дубли из дерева
|
|||
---|---|---|---|
#18+
Kirill RazuvaevwadmanОбратная рекурсия: 3-2-1Только вот как это реализовать? Посмотрите UNION DISTINCT. Можно сначала отобрать уникальные пары, а потом выложить в дерево. Ну или ещё подумать. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.11.2016, 17:32 |
|
|
start [/forum/topic.php?desktop=1&fid=40&tid=1561837]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
52ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 282ms |
total: | 431ms |
0 / 0 |