sql >> データベース >  >> RDS >> Oracle

OracleSQLのネストされた関係を1つのレベルに

    実装しようとしているロジックを完全に理解しているかどうかはわかりませんが、テーブルを作成して出力例を複製するSQLを次に示します。 https://livesql.oracle.com でテストされました。

    データに重複する行やサイクルなどが含まれている可能性がある場合は、例に示されていませんが、クエリを変更する必要がある可能性があるため、これを一言で理解してください。

    概要:

    1. 「with」句では、「ColumnA」と「ColumnB」を1つの列にピボットし、col_srcを追加して、新しい「ColumnAB」がどちらであるかを保持します。

    2. 次に、一致する列Dと前の列Cに一致する列A / Bで接続して、再帰的にクエリを実行します。

    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. テーブルに他のフィールドがある場合、MysqlはDATETIMEインデックスを使用しません

    2. Laravel移行テーブルはすでに存在しますが、古いものではなく新しいものを追加したい

    3. MySQLは、ビット単位の関数を使用してBITフィールドをクエリするときにインデックスを使用しません

    4. mysql:共通テーブル式の複数のSELECTステートメント