Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
Ora uSeR Member Откуда: Сообщений: 1 |
Есть схема связи документов (входящие-исходящие письма):
При создании новой связи документа 1 с документом 2 в таблицу пишется 2 строки:
При установлении связи с документом, который уже имеет историю (проверяю наличие PARENT_ID) в таблицу пишется только одна запись:
История связей:
Необходимо получать ВСЮ историю связей по любому из ID документа, допустим, ID = 273. В примере есть 2 строки ( t1.PK IN (1, 8) ) которые не должны выводиться - это история другого документа.
|
|||
9 окт 18, 18:32 [21699597] Ответить | Цитировать Сообщить модератору |
merch Member Откуда: Сообщений: 130 |
Ora uSeR, connect by |
9 окт 18, 18:40 [21699611] Ответить | Цитировать Сообщить модератору |
dbms_photoshop Member Откуда: sqlmdx.net Сообщений: 5149 |
Ora uSeR, Поскольку интересуют ВСЕ связанные документы безотносительно направления связи, то это задача на ненаправленном графе. Подобные задачи на SQL нормально не решаются. Относительно эффективно в SQL можно решать только задачи на напраленных (где проход допустим только в направлении связи) структурах, будь то дерево или граф. connect by может вернуть все связанные но это будет крайне избыточный перебор select id, min(lvl) dist from (select t1.*, level lvl from t1 start with id = 273 connect by nocycle (prior parent_id in (id, parent_id) or prior id in (id, parent_id))) unpivot (id for type in (parent_id, id)) group by id order by 2; ID DIST ---------- ---------- 247 1 273 1 231 2 265 2 245 3 284 4 283 4 264 4 252 5 9 rows selected. Нормальный подход в таких случаях это обход графа к глубину, который использует список посещенных узлов. Механизм rec with тоже непригоден для поддержания списка обойденных, то есть только PL/SQL. |
9 окт 18, 19:10 [21699645] Ответить | Цитировать Сообщить модератору |
xtender Member Откуда: Мск Сообщений: 5029 |
Ora uSeR, http://orasql.org/2017/09/29/connected-components/ |
9 окт 18, 22:00 [21699791] Ответить | Цитировать Сообщить модератору |
Все форумы / Oracle | ![]() |