ORA-00918:SELECT*中模糊定义的列

use*_*685 29 sql oracle ora-00918

获取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
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

APC*_*APC 50

查询的投影只能有一个给定名称的实例.正如您的WHERE子句所示,您有几个表,其中包含一个名为ID的列.因为您选择*的投影将有几个名为ID的列.或者它不会是编译器投掷ORA-00918.

解决方案非常简单:您必须扩展投影以显式选择命名列.然后你可以省略重复的列,只保留(比如说)COACHES.ID或使用列别名:coaches.id as COACHES_ID.

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

  • 任何时候在有连接时使用 select * 时,都会有重复的数据列,这会浪费资源。 (2认同)

Cra*_*aig 10

在内部查询中有多个名称相同的列,因此在外部查询中引发错误.如果你摆脱了外部查询,它应该运行,虽然仍然令人困惑:

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
Run Code Online (Sandbox Code Playgroud)

这将是很多更好的(用于可读性和性能两者)能明确指定字段,你从每个表,而不是选择他们所有的反正需要.然后,如果您确实需要从不同表中调用相同内容的两个字段,请使用列别名来区分它们.