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

列値でグループ化された単一のテーブルからの組み合わせ

    これは、階層クエリを使用して実行できます。これは、古いスタイルのconnect byを使用したクエリです。 :

    WITH your_table AS (SELECT 1 ID, 'AL' state FROM dual UNION ALL
                        SELECT 1 ID, 'AZ' state FROM dual UNION ALL
                        SELECT 1 ID, 'MI' state FROM dual UNION ALL
                        SELECT 2 ID, 'TX' state FROM dual UNION ALL
                        SELECT 2 ID, 'TN' state FROM dual UNION ALL
                        SELECT 2 ID, 'MO' state FROM dual UNION ALL
                        SELECT 2 ID, 'ND' state FROM dual UNION ALL
                        SELECT 3 ID, 'OH' state FROM dual)
    SELECT ID,
           state,
           ltrim(SYS_CONNECT_BY_PATH(state, ','), ',') combinations,
           LEVEL
    FROM   (SELECT id,
                   state,
                   count(*) OVER (PARTITION BY id) state_cnt
            FROM your_table)
    WHERE  state_cnt = 1
    OR     (state_cnt > 1 AND LEVEL > 1)
    CONNECT BY PRIOR ID = ID
               AND PRIOR state < state
               AND PRIOR sys_guid() IS NOT NULL;
    
            ID STATE COMBINATIONS      LEVEL
    ---------- ----- ------------ ----------
             1 AZ    AL,AZ                 2
             1 MI    AL,AZ,MI              3
             1 MI    AL,MI                 2
             1 MI    AZ,MI                 2
             2 TX    TN,TX                 2
             2 TX    MO,TX                 2
             2 TN    MO,TN                 2
             2 TX    MO,TN,TX              3
             2 ND    MO,ND                 2
             2 TX    MO,ND,TX              3
             2 TN    MO,ND,TN              3
             2 TX    MO,ND,TN,TX           4
             2 TX    ND,TX                 2
             2 TN    ND,TN                 2
             2 TX    ND,TN,TX              3
             3 OH    OH                    1
    

    prior sys_guid() is not null 正しい行をループしていることを確認するには、connect by句の条件が必要です(これを省略すると、結果に多くの余分な行が含まれることになります)。

    IDに単一の状態のみがリストされている場合を除いて、出力で単一の状態のみを持つ行を除外しました。出力に単一の状態を含める場合と含めない場合があります。その場合、述語を完全に削除できます。




    1. getNextExceptionを呼び出して、原因を確認します。Hibernate/JPAに例外のDBサーバーメッセージを表示させる方法

    2. mysqlに複数の行を挿入する

    3. JSON_OBJECT()–MySQLのキー/値ペアのリストからJSONオブジェクトを作成します

    4. Oracleでrow_numberを高速化するにはどうすればよいですか?