【问题标题】:ORA-00918: column ambiguously defined: how to find the columnORA-00918: 列定义不明确: 如何查找列
【发布时间】:2012-09-17 14:33:20
【问题描述】:

我遇到了经典错误:

ORA-00918:列定义不明确

通常,我知道如何解决它,但我现在的问题是我正在处理 700 行查询。

有没有办法识别列?

【问题讨论】:

  • nono 700行SQL代码(约100列)
  • 你用的是什么客户端?大多数会引导您到正确的线路(或足够接近)。
  • Oracle SQL Developer,但没有出现错误行的迹象
  • 一个 700 行的查询通常表明逻辑中存在严重错误。
  • 我知道,没有时间重新排列逻辑,查询不是我的,我只需要修复它,所以我唯一需要的是知道是否有办法识别模棱两可的列

标签: oracle ora-00918


【解决方案1】:

你尝试过二分查找吗?

例如

如果您的原始查询看起来像

Select  col1 
       ,col2
       ,col3
       ,col4
from MyTable
  1. 你可以先评论下半场
Select  col1
       ,col2
       /*,col3
       ,col4 */
from MyTable
  1. 如果您仍然收到错误,请再次运行查询并评论另一半的某些列:
Select col1
       /*,col2 */
      ,col3
      ,col4
from MyTable

如果您仍然收到错误,那么您的问题出在col1,否则您需要更改col2

【讨论】:

  • 甲骨文真的应该来参加聚会并提供更好的错误信息。
  • 此外,如果您有多个定义不明确的列,上述方法可能不起作用。我的生产力一天到此结束。
【解决方案2】:

不明确的列错误消息表明您在查询中加入了两个(或更多)列,它们共享相同的列名。

解决这个问题的正确方法是给查询中的每个表一个别名,然后在所有列引用前加上适当的别名。我同意这么大的查询不会很有趣,但我担心你将不得不为你的前任的松懈付出代价。

【讨论】:

    【解决方案3】:

    在 Oracle 中,您可以使用 all_tab_cols 来查询表的列名。以下查询将返回 TABLE1TABLE2 之间的公共列名。然后,您只需为这些常用列添加前缀,而不是所有 100 列引用。

    select column_name from all_tab_cols
    where table_name='TABLE1' and owner ='OWNER1' 
    and column_name in (
    select column_name from all_tab_cols
    where table_name='TABLE2' and owner ='OWNER2')  
    

    【讨论】:

      【解决方案4】:

      为了后代: 当我在查询中选择列 TABLE1.DES 和 TABLE2.DES 而不对结果进行别名时,我遇到了这个问题。当我单独运行它时,我的 SQL 编辑器将它们变成了 DES 和 DES_1,没有任何抱怨。

      但是当我把同一个查询变成一个子查询时

      SELECT a.col1, a.col2, a.col3, b.*
      from TABLE3 a
      INNER JOIN (
      --that query as a subquery
      ) b
      on a.PK=b.FK`
      

      它抛出了与您描述的相同的 ORA-00918 错误消息。将我的子查询中的 SELECT 更改为

      SELECT TABLE1.DES AS T1_DES, TABLE2.DES AS T2_DES ...

      修复了问题。

      【讨论】:

        【解决方案5】:

        您可以使用以下命令检查常用列:

         select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'tablenamefirst'
        intersect
        select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'tablenamesecond';
        

        【讨论】:

          猜你喜欢
          • 2014-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多