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

Oracle SQL indlejret relation i ét niveau

Jeg er ikke sikker på, om jeg fuldt ud forstår den logik, du forsøger at implementere, men her er SQL, der opretter din tabel og duplikerer dit eksempeloutput. Det blev testet på https://livesql.oracle.com

Tag dette med et gran salt, for hvis dine data kan have duplikerede rækker eller cyklusser eller hvad der ikke er demonstreret i dit eksempel, skal forespørgslen muligvis ændres.

Disposition:

  1. I "with"-klausulen pivoterer vi "ColumnA" og "ColumnB" til en enkelt kolonne og tilføjer col_src for at bevare, hvilken den nye "ColumnAB" er.

  2. Derefter forespørger vi rekursivt og forbinder med en matchende kolonne D og en kolonne A/B, der matcher den forrige kolonne C.

  3. For at matche den angivne bestilling sorterer vi efter:

    • rekursionsniveauet
    • kolonne C
    • om kilden var kolonne A eller B
    • værdien af ​​kolonne A eller B
create table mytable as
select 'A' "ColumnA",'B' "ColumnB",'C' "ColumnC",'E' "ColumnD" from dual
union select 'D' "ColumnA",'C' "ColumnB",'F' "ColumnC",'E' "ColumnD" from dual
union select 'C' "ColumnA",'H' "ColumnB",'I' "ColumnC",'E' "ColumnD" from dual
union select 'C' "ColumnA",'W' "ColumnB",'S' "ColumnC",'E1' "ColumnD" from dual
;

with temp as (
    select "ColumnA" as "ColumnAB", "ColumnC", "ColumnD", 'A' as col_src
    from mytable
    union all select "ColumnB", "ColumnC", "ColumnD", 'B' as col_src
    from mytable
)
select connect_by_root("ColumnAB") "ColumnV", "ColumnC" as "ColumnW" from temp
connect by prior "ColumnD" = "ColumnD" and prior "ColumnC" = "ColumnAB"
order by level,"ColumnC",col_src,  "ColumnAB"



  1. MySQL ACOS() Funktion – Returner Arc Cosinus for et tal

  2. CodeIgniter PDO-databasedriver virker ikke

  3. SQLFeatureNotSupportedException på getArray

  4. Serveren sendte tegnsæt (255) ukendt for klienten, men tegnsættene matcher