1

次のような顧客提供のデータセットがあります:(簡略化)

|ForiegnKey|Code1|Code2|Code3|  
|==========|=====|=====|=====|  
|A         |10   |20   |30   |  
|A         |10   |20   |30   |  
|B         |100  |200  |     |  
|C         |25   |35   |40   |  
|D         |1000 |     |     | 
|E         |     |     |9999 |

最終製品の場合、これを一度に1つの新しいテーブルコードに入力する必要があるため、次のようになります。

|ForiegnKey|Sequence|Code|
|A         |1       |10  |
|A         |2       |20  |
|A         |3       |30  |
|B         |1       |100 |
|C         |1       |25  |
|C         |2       |35  |
|C         |3       |40  |
|D         |1       |1000|
|E         |1       |9999|

私の質問では、ユニオンの使用を伴わないクエリでこれを行う簡単な方法はありますか?
ForiegnKeyの値に基づいてシーケンス番号を生成する必要があります(つまり、ForiegnKey Eの場合、列Code3にあったとしても、シーケンスは1である必要があります)。ユニオンを使用せずにこれをテーブルから取得できるので、同じステートメントでシーケンスIDを生成できます。
D-2と3、E-1と2などの空のコード値はスキップする必要があります。
私は一時的なテーブルを使用してこれに取り組み始めましたが、ここをチェックして、もっと簡単な方法があるかどうかを確認したいと思いました。

ありがとう

4

1 に答える 1

3

UNIONSを回避するよりも、1つのバッチで結果を取得することに関心があるように思われます。どうぞ:

set @last_key = null;
set @seq = 1;
select foreignkey, case when @last_key is null or @last_key != foreignkey then @seq := 1 else @seq := @seq + 1 end as sequence, code, @last_key := foreignkey as foo  from (
  select foreignkey, code1 as code
  from dataset
  where code1 is not null
  union
  select foreignkey, code2
  from dataset
  where code2 is not null
  union
  select foreignkey, code3
  from dataset
  where code3 is not null
  order by 1
) foo;
于 2012-09-17T20:16:12.370 に答える