0

継承された非常に複雑な SQL ビュー定義があり、パフォーマンスを向上させるために変更する必要があります。外部キーに基づいてレコードのリストを取得し、返された行を列として表示します。

したがって :- RANK を使用した select からのデータ

ID RANK DKEY RECORD1 RECORD2 RECORD3
1  1    1    003     Rob     Emmerry
1  2    2    004     Sue     Emmerry

戻り値

ID REC11 REC12 REC13   REC21 REC22 REC23
1  003   Rob   Emmerry 004   Sue   Emmerry

返される行ごとに 37 列のデータが最大 5 まで繰り返されます。

SELECT ID,
MIN(DECODE(ranking,1,RECORD1, NULL)) AS REC11
MIN(DECODE(ranking,1,RECORD2, NULL)) AS REC12
MIN(DECODE(ranking,1,RECORD3, NULL)) AS REC13
MIN(DECODE(ranking,1,RECORD4, NULL)) AS REC14
MIN(DECODE(ranking,1,RECORD5, NULL)) AS REC15
MIN(DECODE(ranking,1,RECORD6, NULL)) AS REC16
MIN(DECODE(ranking,2,RECORD1, NULL)) AS REC21
MIN(DECODE(ranking,2,RECORD2, NULL)) AS REC22
MIN(DECODE(ranking,2,RECORD3, NULL)) AS REC23
MIN(DECODE(ranking,2,RECORD4, NULL)) AS REC24
MIN(DECODE(ranking,2,RECORD5, NULL)) AS REC25
MIN(DECODE(ranking,2,RECORD6, NULL)) AS REC26
FROM 
(
SELECT ID, RANK () OVER (PARTITION BY id ORDER BY dkey) ranking,
RECORD1,
RECORD2,
RECORD3,
RECORD4,
RECORD5,
RECORD6
FROM TABLEA
JOIN
 (SELECT ID, DKEY, RECORD4, RECORD5, RECORD6
  FROM TABLEB
 ) ON TABLEB.DKEY = TABLEA.DKEY AND TABLEB.ID = TABLEA.ID
)
GROUP BY ID;

説明計画を使用し、インデックスを持つ DKEY フィールドでフィルタリングする場合、おそらく min/decode ステートメントが原因で、インデックスは無視されます。

そこで、PIVOT を使用してこれを書き直すことを考えましたが、開始方法がわかりません。

a) インデックスを使用するクエリを取得する方法についての考え b) PIVOT を使用して書き直す

最初のオプションは明らかに好ましいです。

ありがとうクレイグ

アップデート

これは、私のテーブルがどのようになっているかを示すサンプルデータです。

    Table 1             
    DKEY PID RECORD1 RECORD2 RECORD3
    1    1   3       Rob     Emmerry
    2    1   4       Sue     Emmerry
    3    1   4       Jan     Morris
    4    1   4       Sue     Pye
    5    1   4       Jane    Taylor

    Table 2             
    CID DKEY RECORD10       
    1   3    A      
    2   3    D      
    3   3    G      
    4   3    J      
    5   4    A      
    6   5    A      
    7   5    D      
    8   6    A      
    9   6    D      
    10  6    G      
    11  7    A      
    12  7    D      
    13  7    G      
    14  7    J      
    15  7    M      

    Table 3             
    QID DKEY RECORD3        
    1   3    C      
    2   6    C      
    3   6    F      
    4   7    C      
    5   7    F      

したがって、テーブル 2 と 3 は、DKEY を使用してテーブル 1 にリンクされています。例として DKEY=3 を使用した場合、次のようになります。

    PID DKEY REC1 REC2 REC3   REC4 REC5 REC6 REC7 REC8 REC9 REC10 REC11 REC12 REC13
    1   3    4    Jan  Morris A    D    G    J    NULL C    NULL  NULL  NULL  NULL

テーブル 2 と 3 のそれぞれに最大 5 つの行が存在する可能性があります。フィールド PID、DKEY、テーブル 1 の REC1-REC3、REC4-REC8 はテーブル 2 から取得され、残りはテーブル 3 から取得されます。テーブル 1 の他のレコードはそのまま続きます。行で、REC13 の後、DKEY=4 など。

これが理にかなっていることを願っています。

4

1 に答える 1