oracle SQL - 取消透视

Posted

技术标签:

【中文标题】oracle SQL - 取消透视【英文标题】:oracle SQL - unpivot 【发布时间】:2020-04-02 15:40:39 【问题描述】:

你能告诉我,为什么它不起作用吗?:)

    select *
from( select r.region_id, c.country_id
from countries c join regions r on r.region_id = c.region_id)
unpivot(
    valuee for columnValue in (r.region_id))

ORA-01748: 这里只允许简单的列名 01748. 00000 - “这里只允许简单的列名”

【问题讨论】:

You still haven't explained 为什么你认为你想要取消透视,或者你认为它会实现什么。 【参考方案1】:

这部分:

select *

您正在从内部选择中选择列:region_idcountry_id。所以你的 UNPIVOT 部分不需要r.region_id,只需要region_id。 这段代码是正确的(没有错误):

select *
from(select r.region_id
            , c.country_id
     from countries c 
     join regions r on r.region_id = c.region_id)
unpivot(valuee for columnValue in (region_id));

【讨论】:

嗨@MateuszOsiński,不客气。乐意效劳。如果您不介意,请接受我的正确回答。您可以这样做:***.com/help/someone-answers 干杯! 嗨@MateuszOsiński,您还没有将此答案标记为正确吗?【参考方案2】:

您的查询很奇怪,不清楚您要达到什么目的;但是跟进@VBoka 对您的代码的更正,您实际上根本不需要加入(除非您的国家/地区不存在区域)-您可以这样做:

select *
from (
  select region_id, country_id
 from countries
)
unpivot(valuee for columnValue in (region_id));

但是你可以得到相同的结果而无需反透视;如果您有真正的理由加入,请加入:

select c.country_id, 'REGION_ID' as columnvalue, r.region_id as valuee
from countries c
join regions r on r.region_id = c.region_id;

或不加入:

select country_id, 'REGION_ID' as columnvalue, region_id as valuee
from countries;

无论哪种方式,您都会得到一个每个国家/地区都有一行的结果集。

【讨论】:

以上是关于oracle SQL - 取消透视的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Oracle SQL 中取消透视列时出错

取消透视到 Oracle 中的多个列

Oracle 11g:取消透视多个列并包含列名

如何在 Oracle 11 中取消透视单行?

取消透视表 Oracle 中的数据

取消透视 SQL 表中的所有列