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 *在生产代码中被视为不好的做法:明确命名的列更安全.
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)
这将是很多更好的(用于可读性和性能两者)能明确指定字段,你从每个表,而不是选择他们所有的反正需要.然后,如果您确实需要从不同表中调用相同内容的两个字段,请使用列别名来区分它们.