6

我收到了经典错误:

ORA-00918: 列定义不明确

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

有没有办法识别列?

4

5 回答 5

7

您是否尝试过二进制搜索?

例如

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

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

于 2012-09-18T09:48:54.960 回答
6

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

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

于 2012-09-17T15:26:58.057 回答
1

在 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')  
于 2015-09-10T19:14:44.250 回答
0

为了后代的缘故:当我在查询中选择列 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 ...

解决了这个问题。

于 2014-02-05T22:16:19.387 回答
0

您可以使用以下方法检查常用列:

 select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'tablenamefirst'
intersect
select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'tablenamesecond';
于 2018-08-03T15:42:32.023 回答