Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zagnieżdżona relacja Oracle SQL na jednym poziomie

Nie jestem pewien, czy w pełni rozumiem logikę, którą próbujesz zaimplementować, ale oto SQL, który tworzy twoją tabelę i duplikuje twoje przykładowe dane wyjściowe. Został przetestowany na https://livesql.oracle.com

Potraktuj to z przymrużeniem oka, ponieważ jeśli Twoje dane mogą zawierać zduplikowane wiersze lub cykle itp., czego nie pokazano w Twoim przykładzie, zapytanie może wymagać modyfikacji.

Zarys:

  1. W klauzuli „with” przestawiamy „ColumnA” i „ColumnB” do jednej kolumny i dodajemy col_src, aby zachować nową kolumnę „ColumnAB”.

  2. Następnie wykonujemy zapytania rekurencyjne, łącząc pasującą kolumnę D i kolumnę A/B, która pasuje do poprzedniej kolumny C.

  3. Aby dopasować podaną kolejność, sortujemy według:

    • poziom rekurencji
    • kolumna C
    • czy źródłem była kolumna A czy B
    • wartość kolumny A lub 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przetestować połączenie z bazą danych Oracle za pomocą Javy

  2. Jak zwrócić zestaw wyników z okna zapytania w Oracle SQL Developer?

  3. SQL Wiersze do kolumn

  4. Połączenie JDBC z Oracle Clustered

  5. Sejf TO_NUMBER()