【发布时间】:2021-10-06 11:46:02
【问题描述】:
在对子查询的记录进行排序后,我尝试从子查询中获取值,但是在执行查询时发生了以下情况: ORA-00907:缺少右括号
查询是:
select S.value , nvl((select D.value from D
join T on D.subID = t.SubID
where D.subid2 = s.subid2 and t.subid3 = s.subid3 and rownum = 1 order by t.id),0 ) value
from S
【问题讨论】:
-
表格代表无序数据集。子查询结果是一个表。由于这个原因,在子查询中使用
ORDER BY是没有意义的,甚至禁止使用ORDER BY子句结束子查询(Oracle 中该规则有一个例外,但我们忽略它)。对结果进行排序没有任何意义,因为使用rownum = 1您可以选择一行。如果您对包含一行的列表进行排序,那么您当然会得到相同的单行。 -
如果 rownum = 1 意味着在您的子查询中 order by 之后发生,以便获得最低 t.id 的 d.value,您可以将
and rownum = 1 order by t.id更改为order by t.id fetch first row only,这是允许的,因为ORDER BY不是查询中的最后一个子句,因此不对结果进行排序,而只是为 fetch 子句准备中间结果集。另一种选择是 Oracle 的KEEP FIRST,您可以完全删除and rownum = 1 order by t.id并将select D.value替换为select min(d.value) keep (dense_rank first order by t.id)。