什么是甲骨文查询,以填充三种不同的列值,从单行到三不同行,在单列,以及一列生成的动态和结果不应包括空值的列。
表:电信
id --提供者--消费者--接收方
1-伏达丰-t--移动电话- AT&T
预期结果是
id
伏达丰供应商
1--t-移动--消费者
1- AT&T -美国电话电报公司
发布于 2016-06-24 19:31:01
一个简单的使用union all
的方法
select id, provider as name, 'provider' from telecom union all
select id, consumer, 'consumer' from telecom union all
select id, receiver, 'receiver' from telecom ;
这将扫描三次telecom
。一种更有效的方法可能是:
select t.id,
(case which when 'provider' then provider
when 'consumer' then consumer
when 'receiver' then receiver
end) as name,
which
from telecom t cross join
(select 'provider' as which from dual union all
select 'consumer' as which from dual union all
select 'receiver' as which from dual
) x
发布于 2016-06-24 19:53:17
Oracle安装
SET DEFINE OFF;
CREATE TABLE Telecom ( id, provider, consumer, receiver ) AS
SELECT 1, 'vodaphone', 't-mobile', 'AT&T' FROM DUAL;
查询
SELECT id,
name,
"type"
FROM telecom
UNPIVOT( name FOR "type" IN ( provider, consumer, receiver ) );
输出
ID NAME type
---------- --------- --------
1 vodaphone PROVIDER
1 t-mobile CONSUMER
1 AT&T RECEIVER
更新
SET DEFINE OFF;
CREATE TABLE Telecom ( id, col_provider, col_consumer, col_receiver ) AS
SELECT 1, 'vodaphone', 't-mobile', 'AT&T' FROM DUAL UNION ALL
SELECT 1, 't-mobile', NULL, 'EE' FROM DUAL;
查询
SELECT id,
name,
"type"
FROM telecom
UNPIVOT( name FOR "type" IN ( col_provider AS 'provider',
col_consumer AS 'consumer',
col_receiver AS 'receiver' ) );
输出
ID NAME type
---------- --------- --------
1 vodaphone provider
1 t-mobile consumer
1 AT&T receiver
1 t-mobile provider
1 EE receiver
https://stackoverflow.com/questions/38020763
复制相似问题