ORA-00918:列中不明确定义的SELECT *

获取ORA-00918:列不明确定义:运行此SQL:

SELECT * FROM (SELECT DISTINCT(coaches.id), people.*, users.*, coaches.* FROM "COACHES" INNER JOIN people ON people.id = coaches.person_id INNER JOIN users ON coaches.person_id = users.person_id LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id ) WHERE rownum <= 25 

有什么build议吗?

查询的投影只能有一个给定名称的实例。 正如你的WHERE子句所显示的那样,你有几个表中有一个称为ID的列。 因为您正在select*您的投影将有几列称为ID。 或者它不会是编译器投掷ORA-00918。

解决scheme非常简单:您将不得不展开投影以显式select命名列。 然后,你可以省略重复的列,只保留(说)COACHES.ID或使用列别名: coaches.id as COACHES_ID

也许这会打击你很多,但这是唯一的方法。 如果有任何的安慰, SELECT *在生产代码中被认为是不好的做法:明确命名的列更安全。

在内部查询中,有多个列命名为相同的东西,所以在外部查询中引发错误。 如果你摆脱了外部查询,它应该运行,但仍然令人困惑:

 SELECT DISTINCT coaches.id, people.*, users.*, coaches.* FROM "COACHES" INNER JOIN people ON people.id = coaches.person_id INNER JOIN users ON coaches.person_id = users.person_id LEFT OUTER JOIN organizations_users ON organizations_users.user_id = users.id WHERE rownum <= 25 

这将是好得多(为了可读性和性能),以确切地指定从每个表中需要哪些字段,而不是全部select它们。 那么如果你真的需要从不同表中调用同样的东西的两个字段,可以使用列别名来区分它们。

在select相应列可以为空的联合时,也可以看到这个错误。

 select * from (select D.dept_no, D.nullable_comment from dept D union select R.dept_no, NULL from redundant_dept R ) 

这显然混淆了parsing器,一个解决办法是将列别名分配给始终为空的列。

 select * from (select D.dept_no, D.comment from dept D union select R.dept_no, NULL "nullable_comment" from redundant_dept R ) 

别名不必与相应的列相同,但结果中的列标题由联合成员中的第一个查询驱动,所以这可能是一个好习惯。

Interesting Posts