我有这张桌子:
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不支持两个带子句。
我并不关心如何处理重复值,无论最简单/最快。
如何生成适当的输出?
答案 0 :(得分: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
答案 1 :(得分:1)
试试这个,看起来想要将列值转换为行
select val1, score from vals where val1 is not null
union
select val2,score from vals where val2 is not null
答案 2 :(得分:1)
如果您使用的是Oracle 11,则unPivot会提供帮助:
SELECT *
FROM vals
UNPIVOT ( val FOR origin IN (val1, val2) )
你可以选择任何名字而不是'val'和'origin'。