3

我有这张桌子:

Vals
Val1  Val2  Score
A     B     1 
C           2
      D     3

我希望输出是单个列,它是 Vals1 和 Val2 变量的“超集”。它还保留与该值关联的“分数”变量。

输出应该是:

Val Score
A   1
B   1
C   2
D   3

从这个表中选择两次然后合并是绝对不可能的,因为生产它非常昂贵。此外,我不能使用 with 子句,因为此查询在子查询中使用一个,并且由于某种原因 Oracle 不支持两个 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 回答