sql >> Database teknologi >  >> RDS >> Oracle

Oracle SQ Identificer søskende via søskende

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å:

SQL Fiddle

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 

Resultater :

| 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> 

Resultater :

| 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 |

  1. Erstat NonASCII-tegn i MYSQL

  2. postgresql hvad er den bedste måde at eksportere specifik kolonne fra specifik tabel fra en DB til en anden

  3. Hent Oracle-tabeltypen fra den lagrede procedure ved hjælp af JDBC

  4. SQL vælg flere rækker i én kolonne