sql >> Databáze >  >> RDS >> Oracle

Oracle SQL vnořený vztah do jedné úrovně

Nejsem si jistý, zda plně rozumím logice, kterou se snažíte implementovat, ale zde je SQL, který vytvoří vaši tabulku a duplikuje váš příkladový výstup. Byl testován na https://livesql.oracle.com

Berte to prosím s rezervou, protože pokud vaše data mohou mít duplicitní řádky nebo cykly nebo cokoli jiného, ​​což není ukázáno ve vašem příkladu, dotaz může vyžadovat úpravu.

Obrys:

  1. V klauzuli "with" otočíme "ColumnA" a "ColumnB" do jednoho sloupce a přidáme col_src, abychom zachovali, který z nich je nový "ColumnAB".

  2. Poté provedeme rekurzivní dotaz a propojíme odpovídající sloupec D a sloupec A/B, který odpovídá předchozímu sloupci C.

  3. Abychom odpovídali zadané objednávce, řadíme podle:

    • úroveň rekurze
    • sloupec C
    • zda byl zdrojem sloupec A nebo B
    • hodnotu sloupce A nebo 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. Apostrofy a dvojtečky v Pretty Links

  2. výsledkem smyčky mysql je php mimo dotaz mysql

  3. Java spuštěná spouštěčem MySQL

  4. Azure – oprávnění odepřeno při pokusu o připojení k externí databázi MySQL