0

データを含む2つのテーブルがあります

TAB1

    -------------------------
    | ID1 | ID2 |  A    | B |
    |  1  |  8  |'John' | 9 |
    |  2  |  9  |'Smith'| 0 |

TAB2

   ------------------------------------------
   | NAME | ID1 | ID2 | VSTRING | VINT |ROOT|
   | 'C1' |  1  |  8  |  'R01'  | NULL | 'A'|
   | 'C1' |  1  |  8  |  'R02'  | NULL | 'B'|
   | 'C2' |  1  |  8  |   NULL  | 9991 | 'B'|
   | 'C1' |  2  |  9  |  'D02'  | NULL | 'B'|

生成するクエリが必要です

TAB3

    -------------------------------------
    | ID1 | ID2 |   A    |  C1   |  C2  | 
    |  1  |  8  | 'John' | 'R01' | 9991 | 
    |  2  |  9  | 'Smith'| 'D02' | NULL |

TAB1 には、ユーザーと ID が含まれています。TAB2 には、動的構造の列と値が含まれています。1 つのセル ([TAB2.NAME = 'C1' および TAB2.ID1 = 1] を参照) に複数の値がある場合、ROOT = 'A' に関連付けられた値を取得する必要があります。

私が抱えている唯一の問題は、ROOT 列に基づいて正しい値を取得する方法です。次のコードは、TAB3 の正しい構造を返していますが、値が正しくありません。

select t.id1, t.id2, t.a,
    max(case when t2.name = 'C2' then t2.vint end) c2,
    max(case when t2.name = 'C1' then t2.vstring end) c1
from tab1 t
    left join tab2 t2 on t.id1 = t2.id1 and t.id2 = t2.id2 
group by t.id1, t.id2, t.a

理想的には、サブクエリなしで単一のクエリを作成したいと考えています。

サブクエリでこれを行うことができましたが、解決策が遅すぎます。上記の例は、結合されたテーブル SQL Server での Pivotのフォロー アップです。(PS: 実際のモデルには、ほぼ 100 の動的列があります)

4

2 に答える 2

0

ゴードン・リノフの答えは正しいですが、より動的にする方法が見つかりませんでした。幸いなことに、非常に一般的な解決策を見つけました。重要なのは、TAB1 をグループ化された TAB2 と結合することです。

Select * from TAB2 A join 
   (Select ID1, ID2, MIN(ROOT), NAME from TAB2 
       group by ID2, ID1, NAME) B
   on A.ID1 = B.ID1 and B.ID2 = A.ID2 and A.NAME = B.NAME
于 2013-06-07T00:18:20.033 に答える