sql >> Base de Datos >  >> RDS >> Oracle

Relación anidada de Oracle SQL en un nivel

No estoy seguro si entiendo completamente la lógica que está tratando de implementar, pero aquí está SQL que crea su tabla y duplica su salida de ejemplo. Se probó en https://livesql.oracle.com

Tómelo con pinzas porque si sus datos pueden tener filas o ciclos duplicados o lo que sea, eso no se demuestra en su ejemplo, es posible que la consulta deba modificarse.

Esquema:

  1. En la cláusula "with", giramos "ColumnA" y "ColumnB" en una sola columna y agregamos col_src para preservar cuál es la nueva "ColumnAB".

  2. Luego consultamos de forma recursiva, conectándonos mediante una columna D coincidente y una columna A/B que coincide con la columna C anterior.

  3. Para que coincida con el orden proporcionado, ordenamos por:

    • el nivel de recursividad
    • columna C
    • si la fuente fue la columna A o B
    • el valor de la columna A o 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"