ORA-00918: 使用数据透视时列定义不明确

Posted

技术标签:

【中文标题】ORA-00918: 使用数据透视时列定义不明确【英文标题】:ORA-00918: column ambiguously defined when using pivot 【发布时间】:2016-04-06 15:30:24 【问题描述】:

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

【问题讨论】:

你能根据它来自哪个特定表正确地别名 max(rating_adjusted) 试过不行 【参考方案1】:

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

您拥有的最长前缀是 company_stratergy_mgmt,即 22 个字符。聚合别名前会自动添加下划线,因此您在点击 the 30-character column name limit 之前只剩下 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_

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

其他人也有同样的问题,这些只是示例。如果您修复了company_stratergy 的拼写以丢失额外的r,那么即使您取消注释rating_adjustment 聚合,它们也会以_a、@987654334 结尾@ 和 _o 并再次变得独一无二。但是,如果您取消注释 notch_value_% 聚合,您仍然会遇到同样的问题。

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

【讨论】:

以上是关于ORA-00918: 使用数据透视时列定义不明确的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00918: FOR pharmacyschema.sql (RX 药房数据库) 的列定义不明确

不确定为啥会出现 ORA-00918 列定义不明确

ORA-00918: 列定义不明确

Oracle Pivot 和 Pivot XML - ORA-00918:列定义不明确

Oracle Live SQL 中的错误 -> ORA-00918:列定义不明确

ORA-00918: 未明确定义列