ORA-00904涉及内部联接

时间:2018-01-09 16:52:19

标签: sql oracle inner-join

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

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拒绝我的查询?

3 个答案:

答案 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上删除了hackershacker_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;