ORA-00918:使用pivot时模糊定义的列

时间:2016-04-06 15:30:25

标签: oracle oracle11g pivot

有人可以看看我的查询。 当我试图取消评论任何评论字段时,oracle会抛出错误。

SELECT * 
FROM   ( 
              SELECT ratfac.rating_id, 
                     ratfac.label_en, 
                     ratfac.ratingmodel_factor_id, 
                     ratfac.weight, 
                     ratfac.rating_calculated, 
                     ratfac.rating, 
                     ratfac.rating_adjusted, 
                     ratfac.override_comment, 
                     ratfac.rating_override, 
                     ratfac.notch_value, 
                     ratfac.notch_value_calculated, 
                     ratfac.notch_value_adjusted, 
                     ratfac.score, 
                     ratfac.score_calculated, 
                     ratfac.score_adjusted, 
                     ratfac.factor_comment 
              FROM   vw_ratingfactor ratfac ) pivot ( min(ratingmodel_factor_id) ratingmodel_factor_id, min(weight) weight, min(rating_calculated) rating_calculated, min(rating) rating,
       --MAX(RATING_ADJUSTED) as RATING_ADJ, 
       min(override_comment) override_comment, min(rating_override) rating_override, min(notch_value) notch_value,
       --MIN(NOTCH_VALUE_CALCULATED) NOTCH_VALUE_CALCULATED, 
       --MIN(NOTCH_VALUE_ADJUSTED) NOTCH_VALUE_ADJUSTED, 
       min(score) score, min(score_calculated) score_calculated, min(score_adjusted) score_adjusted, min(factor_comment) factor_comment FOR label_en IN ('Market'
                                                                                                                                                                || chr(38)
                                                                                                                                                                ||'Competitiveness'        AS marketcompetitiveness,
                                                                                                                                                         'Industry'                        AS industry,
                                                                                                                                                         'Company Strategy and Management' AS company_stratergy_mgmt,
                                                                                                                                                         'Financial Performance'           AS financial_performance,
                                                                                                                                                         'Need for and Access to Funds'    AS needforfunds ) )

1 个答案:

答案 0 :(得分:2)

问题是生成的列的名称长度。

您拥有的最长前缀为company_stratergy_mgmt,即22个字符。在聚合别名之前会自动添加下划线,因此在您点击the 30-character column name limit之前只剩下7个字符。 Oracle正在以30-char的限制默默地截断生成的名称,这导致了重复项。

某些聚合是正常的,例如rating,生成company_stratergy_mgmt_rating - 29个字符。然后,您可以拥有一个的名称,例如rating_%。但你有两个,所以它试图生成如下名称:

company_stratergy_mgmt_rating_calculated  -> company_stratergy_mgmt_rating_
company_stratergy_mgmt_rating             OK
company_stratergy_mgmt_rating_override    -> company_stratergy_mgmt_rating_

company_stratergy_mgmt_rating_calculatedcompany_stratergy_mgmt_rating_override都被截断为相同 30个字符的名称company_stratergy_mgmt_rating_。因为它们是相同的,列名是重复的,因此ORA-00918错误。

其他人也有同样的问题,这些只是一些例子。如果您修改了company_stratergy的拼写而失去了额外的r,那么您就可以使用这些列来消除它,即使您取消注释了rating_adjustment聚合,也会如此以_a_c_o结束并再次独一无二。但是,如果取消注释notch_value_%聚合,您仍会遇到同样的问题。

因此,您需要选择较短的前缀或较短的聚合别名,以便最好不截断所有生成的名称,如果它们被截断,则它们仍然是唯一的。