В базе данных у меня есть 2 следующих фрагмента информации для каждого идентификатора.Компания, которая их контролирует, и компании, в которых у них есть небольшие кусочки контроля.
Нечто подобное, 2 таблицы (игнорируя некоторые уникальные идентификаторы):
организации
orgid | org_immediate_parent_orgid
1 | 2
2 | 2
3 | 1
5 | 4
Отношение orgid -> org_immediate_parent_orgid означает, что компания имеет родителя.Для меня это относится только к org_immediate_parent_orgid -> orgid, материнская компания которого имеет в качестве дочернего предприятия
org_affiliations
orgid | affiliated_orgid
2 | 3
2 | 5
4 | 1
1 | 5
orgid -> affiliated_orgid - Компания имеет филиал
Визуальное представление должно выглядеть примерно так:
На красных отношениях от организаций , на синих отношениях org_affiliations .
Если хотите, чтобы все компании, принадлежащие 2 (или дочернему сыну 2), имели какое-то участие в них:
select m.org_immediate_parent_orgid
,m.orgid
from oa.organizations m
where m.org_immediate_parent_orgid is not null
start with m.orgid in (Identifiers)
connect by nocycle prior m.orgid=m.org_immediate_parent_orgid
возвращает
org_immediate_parent_orgid| orgid
1 | 2
2 | 2
3 | 1
ЕслиХотите, чтобы все компании были 2 (или дочерним сыном 2) имеет какое-то участие в них их:
select aff.orgid,aff.affiliated_orgid
from oa.org_affiliations aff
where aff.affiliated_orgid is not null
start with aff.orgid in(Identifiers)
connect by nocycle prior aff.affiliated_orgid =aff.orgid
возврат
orgid | affiliated_orgid
2 | 3
2 | 5
Итак, из всех возможных отношений:
- Aff -> Aff
- Aff -> Sub
- Sub -> Aff
- Sub -> Sub
Я нахожу только Sub -> Sub (дочерние компании дочерних компаний), отношения (2 -> 1 и отношения 1 -> 3) и Aff -> Aff, отношения (2 -> 3 и отношения 2 -> 5),Кроме того, он требует от меня 2 отдельных запросов.
Как я могу получить все возможные отношения в одном рекурсивном запросе?
Если я передам идентификатор 2, то будет возможно следующее возвращение:
Relation | Loop| orgid | children
Sub | 1 | 2 |2
Sub | 1 | 2 |1
Aff | 1 | 2 |3
Aff | 1 | 2 |5
Sub | 2 | 1 |3
Aff | 2 | 1 |5
В каждом цикле проверял бы подписчики и филиалы для каждого идентификатора.Повторите для новых детей.
Есть идеи, как к этому подойти?
TL: DR: 2 таблицы (дочерние компании \ филиалы), 2 запроса.хочу один запрос, где от компании я нахожу все дочерние и зависимые компании и все возможные комбинации дочерних компаний.Окончательный ожидаемый результат, просто следуйте представлению изображения.
Редактировать: Как прокомментировал Крейг, я исправил вывод.
Редактировать 2: СледующийКрэйг и Боб Джарвис оказали мне хорошую помощь, и я продолжаю сталкиваться с проблемами.
Для сбора дочерних компаний следующий код работает безупречно, и вывод такой, какой я хотел бы:
with
relations as
(
select orgid as children,org_immediate_parent_orgid as orgid,'Sub' as relation
from oa.organizations
)
select distinct relation, level, orgid, children
from relations
where children is not null
start with orgid in (identifier)
connect by
nocycle prior children = orgid
order by 2,3,4
То же самое для AFF:
with
relations as
(
select affiliated_orgid as children, orgid as orgid,'Aff' as relation
from oa.org_affiliations
)
select distinct relation, level, orgid, children
from relations
where children is not null
start with orgid in (identifier)
connect by
nocycle prior children = orgid
order by 2,3,4
, но не может иметь "объединение всех"?
with
relations as
(
select orgid as children,org_immediate_parent_orgid as orgid,'Sub' as relation
from oa.organizations
UNION ALL
select affiliated_orgid as children, orgid as orgid,'Aff' as relation
from oa.org_affiliations
)
select distinct relation, level, orgid, children
from relations
where children is not null
start with orgid in (identifier)
connect by
nocycle prior children = orgid
order by 2,3,4
В sql developer я пошел и проверил "объясните план и стоимость каждого прыжка с 7 до 400k,просто добавив "union all". Любой обходной путь? Является ли проблема внутри CTE, в union alL?
Решение Боба Джарвиса не будет работать в тех случаях, когда у меня есть comp-sub-sub-aff-aff, или он находитвсе дочерние компании или все филиалы