【问题标题】:Oracle syntax error on JOIN to sub-queryJOIN 到子查询的 Oracle 语法错误
【发布时间】:2013-02-13 22:11:38
【问题描述】:

以下代码已经是一个简化的示例,但仍然会产生语法错误:

ORA-00904: "R"."READING_TIME": invalid identifier

SELECT r.user_id, rm.reading_time start_time, r.reading_time end_time
FROM Readings r 
INNER JOIN  (
      SELECT r2.user_id, r2.reading_time, r2.x, r2.y
      FROM Readings r2
      WHERE r2.user_id=r.user_id and 
            r2.reading_time < r.reading_time
      ) rm   
ON r.user_id=rm.user_id;

为什么内部查询与外部查询的别名有问题?

链接到我的小提琴:http://sqlfiddle.com/#!4/0d4b5/21

UPDATE: 我通过执行自连接并将相关查询移动到 ON 子句来解决问题。

更新了整个脚本的小提琴:http://sqlfiddle.com/#!4/39032/10

【问题讨论】:

  • 因为不能加入子查询。这是 Hamlet 纠正的语法错误。
  • @ypercube - 你是对的。我正在将该查询从 SQL Server 2008 重写为 Oracle 11g。

标签: sql join oracle11g subquery


【解决方案1】:

“rm”内联视图无法访问外部查询列,因此无法在内部查询中引用 r.user_idr.reading_time。你必须在外面过滤:

SELECT r.user_id, rm.reading_time start_time, r.reading_time end_time
FROM Readings r 
INNER JOIN  (
      SELECT r2.user_id, r2.reading_time, r2.x, r2.y
      FROM Readings r2
      ) rm   
ON rm.user_id=r.user_id 
AND rm.reading_time < r.reading_time;

【讨论】:

  • 所以我不能在这里使用相关子查询?
  • 关联子查询是指 where 子句中有一个子查询,该子查询引用了 parent from 子句中的表 - 但这种情况不适用于此处。我将您的查询重写为正确的方式,即您在内联视图之外有连接(在这种微不足道的情况下,我们可以简化为与 hamlet 发布的相同,但我假设您的真实 SQL 更复杂)
  • 我可以将相关子查询作为 ON 表达式的一部分吗?
  • @PM77-1 是的。即你可以有select .. from taba a join tabb b on a.id = b.id and a.id in (select c.val from tabc c where c.id=a.id)
【解决方案2】:

您不能从 JOIN 的一个部分引用另一部分。

你在找这个吗?

SELECT r.user_id, r2.reading_time start_time, r.reading_time end_time
FROM Readings r 
INNER JOIN Readings r2 
ON r.user_id=r2.user_id
   AND r2.reading_time < r.reading_time;

SQL FIDDLE

【讨论】:

  • 我的代码目前没有任何意义。这只是一个简化的样本,试图定位语法错误的来源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2016-05-03
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 2014-07-14
相关资源
最近更新 更多