在Oracle上无法按视图取消透视 [英] Unpivot on view is not working in Oracle

查看:96
本文介绍了在Oracle上无法按视图取消透视的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下查询

select distinct cd, nm, 
  case when parent=cd then 0 else parent end as parent, lvl 
from (
  select * from mytable
  unpivot (
      (cd, nm, parent) for lvl in ((CD_1, NM_1, CD_1) as 1,(CD_2, NM_2, CD_1) as 2,(CD_3, NM_3, CD_2) as 3,(CD_4, NM_4, CD_3) as 4, (CD_5, NM_5, CD_4) as 5)
  )
)
order by lvl;

如果 mytable 是一个表,则工作正常. 基本上,我的来源是一个视图,如果将 mytable 替换为我的视图,则会抛出错误ORA-00933:SQL命令未正确结束.

If mytable is a table this is working fine. Basically my source is a view , if replace the mytable with my view its throwing an error ORA-00933 : SQL command not properly ended.

是否有其他方法可以消除该错误?

Any alternate for removing that error??

这是视图结构

DROP VIEW MY_VIEW;

/* Formatted on 2/4/2016 3:12:19 PM (QP5 v5.149.1003.31008) */
CREATE OR REPLACE FORCE VIEW MY_VIEW
(
   CHIEF_NM,
   CHIEF_NO,
   CMPNY_CD,
   CMPNY_NM,
   COST_CNTR_CD,
   COST_CNTR_NM,
   INCMBNT_PRSN_NM,
   OBJECT_ID,
   1_CD,
   1_NM,
   2_CD,
   2_NM,
   3_CD,
   3_NM,
   4_CD,
   4_NM,
   5_CD,
   5_NM,
   6_CD,
   6_NM,
   7_CD,
   7_NM,
   8_CD,
   8_NM,
   9_CD,
   9_NM,
   10_CD,
   10_NM,
   11_CD,
   11_NM,
   12_CD,
   12_NM,
   13_CD,
   13_NM,
   14_CD,
   14_NM,
   15_CD,
   15_NM,
   ORG_UNIT_NM,
   PRSNNL_AREA_CD,
   PRSNNL_AREA_NM,
   PRSNNL_SUBAREA_CD,
   PRSNNL_SUBAREA_NM,
   ESA_LAST_UPDT_TMSTMP,
   SNAPSHOT_DT,
   LOG_DEL_IND
)
AS
   SELECT chief_nm,
          chief_no,
          cmpny_cd,
          cmpny_nm,
          cost_cntr_cd,
          cost_cntr_nm,
          incmbnt_prsn_nm,
          object_id,
          1_cd,
          1_nm,
          2_cd,
          2_nm,
          3_cd,
          3_nm,
          4_cd,
          4_nm,
          5_cd,
          5_nm,
          6_cd,
          6_nm,
          7_cd,
          7_nm,
          8_cd,
          8_nm,
          9_cd,
          9_nm,
          10_cd,
          10_nm,
          11_cd,
          11_nm,
          12_cd,
          12_nm,
          13_cd,
          13_nm,
          14_cd,
          14_nm,
          15_cd,
          15_nm,
          org_unit_nm,
          prsnnl_area_cd,
          prsnnl_area_nm,
          prsnnl_subarea_cd,
          prsnnl_subarea_nm,
          esa_last_updt_tmstmp,
          esa_last_updt_tmstmp snapshot_dt,
          log_del_ind
     FROM TBLE a
    WHERE a.exp_dt = TO_DATE ('31-Dec-9999', 'dd-Mon-yyyy')
;

下面是我的表结构

DROP TABLE mytable;
CREATE TABLE mytable(
   OBJECT_ID INTEGER  NOT NULL PRIMARY KEY 
  ,CD_1      INTEGER  NOT NULL
  ,NM_1      VARCHAR(15) NOT NULL
  ,CD_2      INTEGER  NOT NULL
  ,NM_2      VARCHAR(28) NOT NULL
  ,CD_3      INTEGER  NOT NULL
  ,NM_3      VARCHAR(20) NOT NULL
  ,CD_4      INTEGER  NOT NULL
  ,NM_4      VARCHAR(28) NOT NULL
  ,CD_5      INTEGER  NOT NULL
  ,NM_5      VARCHAR(16) NOT NULL
  ,DT        VARCHAR(14) NOT NULL
);

推荐答案

如Aleksej所说-在Oracle服务器版本<上将无法使用. 11克.

As Aleksej already said - it won't work on the Oracle server version < 11g.

所以这是一种古老而又有点讨厌"的方法...

So here is an old and bit "nasty" approach...

select key, c1, c2, c3 from t order by key ;

KEY C1    C2    C3
--- ----- ----- -----
r1  v1    v2    v3
r2  v1    v2
r3  v1          v3
r4  v1
r5        v2    v3
r6        v2
r7              v3
r8

我们可以将C1,C2和C3值的每一行转换为单列下的三行值,如下所示.

We can convert each row of C1, C2, and C3 values into three rows of values under a single column as follows.

break on key skip 1 duplicates
select key, 'C1' as source, c1 as val from t union all
select key, 'C2' as source, c2 as val from t union all
select key, 'C3' as source, c3 as val from t
order by key, source ;

KEY SOURCE VAL
--- ------ -----
r1  C1     v1
r1  C2     v2
r1  C3     v3
r2  C1     v1
r2  C2     v2
r2  C3
r3  C1     v1
r3  C2
r3  C3     v3
r4  C1     v1
r4  C2
r4  C3
r5  C1
r5  C2     v2
r5  C3     v3
r6  C1
r6  C2     v2
r6  C3
r7  C1
r7  C2
r7  C3     v3
r8  C1
r8  C2
r8  C3

如果我们不需要C1,C2或C3中具有NULL值的行,则可以使用WHERE子句将其过滤掉.

If we do not need the rows with NULL values from C1, C2, or C3 we can use WHERE clauses to filter them out.

select key, 'C1' as source, c1 as val from t where c1 is not null union all
select key, 'C2' as source, c2 as val from t where c2 is not null union all
select key, 'C3' as source, c3 as val from t where c3 is not null
order by key, source ;

KEY SOURCE VAL
--- ------ -----
r1  C1     v1
r1  C2     v2
r1  C3     v3
r2  C1     v1
r2  C2     v2
r3  C1     v1
r3  C3     v3
r4  C1     v1
r5  C2     v2
r5  C3     v3
r6  C2     v2
r7  C3     v3

(c) http://oracle-knowledgeshare.blogspot .de

这篇关于在Oracle上无法按视图取消透视的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆