我收到经典错误:
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')
以下命令检查公共列:
select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'tablenamefirst'
intersect
select COLUMN_NAME from ALL_TAB_COLS where TABLE_NAME = 'tablenamesecond';
为了后代:当我选择TABLE1列时,我遇到了这个问题。DES 和表 2.查询中的 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 ...
修复了该问题。