ORA-00918: 使用枢轴时列定义不明确

Vis*_*eja 0 oracle pivot oracle11g

有人可以看看我的查询。当我尝试取消对任何注释字段的注释时,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 ) )
Run Code Online (Sandbox Code Playgroud)

Ale*_*ole 5

问题是为透视列生成的列名的长度。

您拥有的最长前缀company_stratergy_mgmt是 22 个字符。在聚合别名之前会自动添加下划线,因此在达到30 个字符的列名限制之前,您只剩下 7 个字符了。Oracle 正在以 30 个字符的限制静默截断生成的名称,这导致了重复。

一些聚合是可以的,例如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_
Run Code Online (Sandbox Code Playgroud)

双方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_%聚合的注释,你仍然会遇到同样的问题。

所以你需要选择更短的前缀,或者更短的聚合别名,这样所有生成的名称最好不要被截断,如果它们被截断,那么它们仍然是唯一的。