Det er uklart, om relationerne er refleksive (dvs. hvis B
er en "søskende" til A
derefter A
er en "søskende" til B
), da du har nogle duplikerede rækker med de omvendte relationer i dine data og nogle, hvor denne egenskab ikke er tydelig.
Forudsat at dine forhold ikke er refleksive så:
Oracle 11g R2 Schema Setup :
OPRET TABEL A ( ID, SIBS ) ASSELECT 'A', 'B' FRA DUAL UNION ALLSELECT 'A', 'C' FROM DUAL UNION ALLSELECT 'B', 'A' FROM DUAL UNION ALLSELECT 'C ', 'A' FRA DUAL UNION ALLSELECT 'C', 'D' FRA DUAL UNION ALLSELECT 'D', 'C' FRA DUAL UNION ALLSELECT 'E', 'F' FRA DUAL UNION ALLSELECT 'F', 'G' FRA DUAL UNION ALLSELECT 'G', 'H' FRA DUAL;
Forespørgsel 1 :
VÆLG DISTINCT CONNECT_BY_ROOT( ID ) AS ID, SIBSFROM AWHERE CONNECT_BY_ROOT( ID ) <> SIBSCONNECT BY NOCYCLE PRIOR SIBS =IDORDER BY ID, SIBS
| ID | SIBS ||----|------|| A | B || A | C || A | D || B | A || B | C || B | D || C | A || C | B || C | D || D | A || D | B || D | C || E | F || E | G || E | H || F | G || F | H || G | H |
Forespørgsel 2 :Hvis de er refleksive, kan du bruge UNION [ALLE]
at duplikere tabellen med relationerne i den modsatte retning og derefter bruge den forrige teknik:
VÆLG DISTINCT CONNECT_BY_ROOT( ID ) AS ID, SIBSFROM ( SELECT ID, SIBS FROM A UNION SELECT SIBS, ID FROM A)WHERE CONNECT_BY_ROOT( ID ) <> SIBSCONNECT BY NOCYCLE PRIOR SIBS =IDORDER BY ID, SIBS /kode>
| ID | SIBS ||----|------|| A | B || A | C || A | D || B | A || B | C || B | D || C | A || C | B || C | D || D | A || D | B || D | C || E | F || E | G || E | H || F | E || F | G || F | H || G | E || G | F || G | H || H | E || H | F || H | G |