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