3

私はこのテーブルを持っています:

Vals
Val1  Val2  Score
A     B     1 
C           2
      D     3

出力を Vals1 変数と Val2 変数の「スーパーセット」である単一の列にしたいと考えています。また、その値に関連付けられた「スコア」変数も保持します。

出力は次のようになります。

Val Score
A   1
B   1
C   2
D   3

このテーブルから 2 回選択してから結合することは絶対に不可能です。作成には非常にコストがかかるからです。さらに、このクエリはサブクエリで with 句を使用し、何らかの理由で Oracle は 2 つの with 句をサポートしていないため、with 句を使用できません。

私は、繰り返し値がどのように処理されるかについてはあまり気にしません。

適切な出力を生成するにはどうすればよいですか?

4

3 に答える 3

9

unpivotを使用しないソリューションは次のとおりです。

with columns as (
  select level as colNum from dual connect by level <= 2
),
results as (
  select case colNum
              when 1 then Val1
              when 2 then Val2
            end Val,
         score
    from vals,
         columns
)
select * from results where val is not null

これは基本的にWITH句のない同じクエリです。

select case colNum
            when 1 then Val1
            when 2 then Val2
         end Val,
       score
  from vals,
       (select level as colNum from dual connect by level <= 2) columns
 where case colNum
            when 1 then Val1
            when 2 then Val2
         end is not null

またはもう少し簡潔に

select *
  from ( select case colNum
                     when 1 then Val1
                     when 2 then Val2
                  end Val,
                score
           from vals,
                (select level as colNum from dual connect by level <= 2) columns
        ) results
 where val is not null
于 2012-06-26T02:33:46.167 に答える
1

Oracle 11 を使用している場合は、unPivot が役立ちます。

SELECT *
  FROM vals
UNPIVOT ( val FOR origin IN (val1, val2) )

「val」と「origin」の代わりに任意の名前を選択できます。

pivot / unPivot に関する Oracle の記事を参照してください。

于 2012-06-26T03:42:28.270 に答える
1

これを試してみてください。列の値を行に変換したいようです

select val1, score from vals where val1 is not null
union 
select val2,score from vals where val2 is not null
于 2012-06-26T02:25:28.880 に答える