sql >> Databasteknik >  >> RDS >> Oracle

Oracle SQL kapslade relation till en nivå

Jag är inte säker på om jag helt förstår logiken du försöker implementera, men här är SQL som skapar din tabell och duplicerar din exempelutdata. Den testades på https://livesql.oracle.com

Vänligen ta detta med en nypa salt, för om din data kan ha dubbletter av rader eller cykler eller något annat, som inte visas i ditt exempel, kan frågan behöva modifieras.

Översikt:

  1. I "with"-satsen pivoterar vi "ColumnA" och "ColumnB" till en enda kolumn och lägger till col_src för att bevara vilken den nya "ColumnAB" är.

  2. Sedan frågar vi rekursivt och kopplar samman med en matchande kolumn D och en kolumn A/B som matchar föregående kolumn C.

  3. För att matcha den angivna beställningen sorterar vi efter:

    • rekursionsnivån
    • kolumn C
    • om källan var kolumn A eller B
    • värdet för kolumnen 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. Django på Google App Engine med Cloud SQL i utvecklarmiljö

  2. SQL Server - Problem med att skicka variabel till en lagrad procedur

  3. Vad är det för fel på min SQL här? #1089 - Felaktig prefixnyckel

  4. Uppdatera flera tabeller i SQL Server med INNER JOIN