Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle SQL вложена връзка в едно ниво

Не съм сигурен дали разбирам напълно логиката, която се опитвате да приложите, но ето SQL, който създава вашата таблица и дублира вашия примерен изход. Беше тестван на https://livesql.oracle.com

Моля, приемете това със зърно сол, защото ако вашите данни може да имат дублиращи се редове или цикли или какво ли още не, което не е демонстрирано във вашия пример, заявката може да се нуждае от промяна.

Контур:

  1. В клаузата „with“ завъртаме „ColumnA“ и „ColumnB“ в една колона и добавяме col_src, за да запазим коя е новата „ColumnAB“.

  2. След това правим рекурсивна заявка, свързвайки се чрез съответстваща колона D и колона A/B, която съответства на предишната колона C.

  3. За да съответства на предоставения ред, сортираме по:

    • нивото на рекурсия
    • колона C
    • дали източникът е колона A или B
    • стойността на колона A или 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. настройка на клиентска информация в JDBC за Oracle

  2. Суперключ, кандидат ключ и първичен ключ

  3. Валидна заявка GROUP BY не работи, когато се комбинира с INSERT INTO на Oracle

  4. Как да изпълним този израз на Oracle на JDBC

  5. Форматирайте общата стойност във валута с 2 знака след десетичната запетая