I baza danych Mam 2 następujące informacje dla każdego identyfikatora. Firma, która je kontroluje, oraz firmy, w których mają niewielką kontrolę.SQL Multi Condition CTE Recursion
coś wzdłuż linii, 2 stoliki (pomijając kilka unikalnych identyfikatorów)
organizacji do
orgid | org_immediate_parent_orgid
1 | 2
2 | 2
3 | 1
5 | 4
Relacja orgid -> org_immediate_parent_orgid Oznacza Firma posiada rodzica. Por mi jej odpowiednie tylko org_immediate_parent_orgid -> orgid rodzic z firm ma za zależnej
org_affiliations
orgid | affiliated_orgid
2 | 3
2 | 5
4 | 1
1 | 5
orgid -> affiliated_orgid jest Spółka posiada Partnerowi
reprezentacja wizualna powinna być coś takiego:
Na czerwonych relacjach z organizacji , na niebieskich relacjach org_affiliations.
Jeśli chcesz, aby wszystkie przedsiębiorstwa należące do 2 (lub zależnej syna 2) ma jakiś udział w niej nich
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
powraca
org_immediate_parent_orgid| orgid
1 | 2
2 | 2
3 | 1
Jeśli Chcesz uzyskać wszystkie firmy były 2 (lub syn związany z 2) ma jakiś udział w niej nich
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
powraca
orgid | affiliated_orgid
2 | 3
2 | 5
Więc wszystkich możliwych relacji:
- Aff -> Aff
- Aff -> Sub
- Sub -> Aff
- Sub -> Sub
Znajduję tylko Sub -> Sub (filie podmiotów zależnych), relacje (2 -> 1 i relacje 1 -> 3) oraz Aff -> Aff, relacje (2 -> 3 i relacje 2 -> 5). Również wymaga 2 oddzielnych zapytań.
Jak mogę pobrać wszystkie możliwe relacje w jednym pojedynczym zapytaniu cyklicznym?
Jeśli mijam identyfikator 2 powinno być możliwe następujące zwrot:
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
W każdym cyklu byłoby sprawdzić kanapki i oddziałów dla każdego identyfikatora. Powtórz dla nowych dzieci.
Masz pomysł, jak do niego podejść?
TL: DR: 2 stoły (spółki zależne \ podmioty stowarzyszone), 2 zapytania. chcę pojedynczego zapytania, skąd w firmie znajduję wszystkie filie i filie oraz wszystkie możliwe kombinacje subskrybentów. Ostateczny wynik oczekiwany pokaż, wystarczy postępować zgodnie z reprezentacji obrazu.
Edytuj: W komentarzu Craig naprawiłem wyjście.
Edit2: Po dobrej pomocy Craiga i Boba Jarvisa nadal napotykam na problemy.
do zbierania zależnych, następujący kod działa flawlessy, a wyjście jest jak chciałbym:
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
samo dla 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
ale mogę mieć "zjednoczenie wszystkich"?
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
W SQL Developer poszedłem i sprawdzić „wyjaśnić plan i koszty z każdego skoku od 7 do 400K, po prostu dodając«zjednoczenie wszystkich». Wszelkie workarround? Czy problem wewnątrz CTE, w unii wszystko?
Bob Jarvis rozwiązanie praca przyzwyczajenie w przypadkach gdzie mam comp-sub-sub-AFF, czy to wyszukuje wszystkie filie firmy lub wszystkich oddziałów
+1 dla pięknego cięcia. jednak zbyt długo ... nie słuchałem :) – Bohemian
Musiałem to jakoś wyjaśnić: D – blueomega
To za długo, abym czytał, rozumiał i odpowiadał! – Kangkan