我有一个非常简单的查询,我正在尝试执行:
select *
from submissions
inner join (
select *
from hackers
inner join challenges
on hackers.hacker_id = challenges.hacker_id
) dtable
on submissions.challenge_id = dtable.challenge_id
and submissions.hacker_id = dtable.hacker_id;
甲骨文拒绝它:
ORA-00904:"DTABLE"。HACKER_ID":标识符无效。
我通过将别名放在括号外来保持别名dtable
可见。 为什么甲骨文拒绝我的查询?
子查询中的SELECT *
是一个问题。
在要联接的两个表中具有相同的列名。 这意味着您正在尝试创建一个名为 dtable
的内联视图,其中至少有两列具有相同的名称(在这种情况下,两个表都有一个hacker_id
列,您使用*
本质上是说"同时使用它们"。 你不能这么做。
子查询中需要SELECT hackers.a, hackers.b, challenges.x, challenges.y, etc, etc
。 通过以这种方式显式,可以确保没有两列具有相同的名称。
另一种选择可能是SELECT hackers.*, challenges.a AS c_a, challenges.b AS c_b, etc
.
无论哪种方式,您都要明确要选择哪些字段,它们的位置和名称是什么,等等。 最终结果是,您可以避免与其他列同名的列。
您不需要子查询。 您的查询实际上并不"简单"。 简单表单看起来更像这样:
select . . .
from submissions s join
hackers h
on s.hacker_id = h.hacker_id join
challenges c
on s.challenge_id = c.challenge_id;
请注意,我在 hacker_id
上删除了 challenge
和 hackers
之间的条件。 这个额外的join
条件对我来说并没有真正的意义(尽管如果您提供示例数据,它可能有意义(。
正如其他人所说:子选择从两个不同的表中hacker_id
选择两个不同的列。这让甲骨文感到困惑。
但是不需要子选择
select * from
submissions
inner join challenges
on submissions.challenge_id = challenges.challenge_id
inner join hackers
on submissions.hacker_id = hackers.hacker_id;