我收到了经典错误:
ORA-00918: 列定义不明确
通常,我知道如何解决它,但我现在的问题是我正在处理 700 行查询。
有没有办法识别列?
您是否尝试过二进制搜索?
例如
如果您的原始查询看起来像
Select col1
,col2
,col3
,col4
from MyTable
Select col1
,col2
/*,col3
,col4 */
from MyTable
Select col1
/*,col2 */
,col3
,col4
from MyTable
如果你仍然得到一个错误那么你的问题是与col1
,否则你需要改变col2
。
不明确的列错误消息表明您在查询中加入了两个(或更多)列,它们共享相同的列名。
解决这个问题的正确方法是给查询中的每个表一个别名,然后在所有列引用前加上适当的别名。我同意这么大的查询不会很有趣,但我担心你将不得不为你的前任的松懈付出代价。
在 Oracle 中,您可以使用all_tab_cols来查询表的列名。以下查询将返回TABLE1和TABLE2之间的公共列名。然后,您只需要为这些公共列添加前缀,而不是所有 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')
为了后代的缘故:当我在查询中选择列 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 ...
解决了这个问题。
您可以使用以下方法检查常用列:
select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'tablenamefirst'
intersect
select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'tablenamesecond';