ORA-00904 涉及内部联接的查询的标识符无效



我有一个非常简单的查询,我正在尝试执行:

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 上删除了 challengehackers 之间的条件。 这个额外的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;