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

Oracle SQLは、同じIDであるが、識別子が正しくない複数の行をマージします

    このようなもの(入力テーブルに重複する行がないと仮定します。重複する行がある場合は、ソリューションを少し変更する必要があります)。

    このソリューションでは、テスト用のtest_tableを作成し(ソリューションの一部ではありません)、WITH句で別の因数分解されたサブクエリを作成します。これは、Oracle11以降で機能します。以前のバージョンのOracleの場合、サブクエリはprepとして定義されていました。 代わりに、最終クエリ内でサブクエリとして移動する必要があります。

    with
         test_table ( id, identifiers ) as (
           select '1', '|1|2|'        from dual union all
           select '1', '|2|1|'        from dual union all
           select '2', '|3|A|1|B|'    from dual union all
           select '2', '|B|1|3|A|'    from dual union all
           select '3', '|1|3|2|'      from dual union all
           select '3', '|1|5|'        from dual union all
           select '3', '|2|1|3|'      from dual union all
           select '4', '|AA|BB|1|3A|' from dual union all
           select '4', '|1|3A|AA|BB|' from dual
         ),
         prep ( id, identifiers, token ) as (
           select id, identifiers, regexp_substr(identifiers, '[^|]+', 1, level)
           from   test_table
           connect by level <= regexp_count(identifiers, '\|') - 1
               and prior identifiers = identifiers
               and prior sys_guid() is not null
         )
    select distinct id, 
           '|' || listagg(token, '|') within group (order by token) || '|'
                                                    as identifiers
    from   prep
    group by id, identifiers
    order by id, identifiers    --  ORDER BY is optional
    ;
    

    出力

    ID  IDENTIFIERS
    --- --------------------
    1   |1|2|
    2   |1|3|A|B|
    3   |1|2|3|
    3   |1|5|
    4   |1|3A|AA|BB|
    
    5 rows selected.
    



    1. 非常に大きなテーブルでの(列ストア)圧縮の楽しみ–パート3

    2. このMySQLステートメントをsymfonyPropelに変換する方法は?

    3. mysqlをswiftに接続する方法は?

    4. 警告:PHPとMySQLでのゼロ除算