这个Oracle SQL SELECT不应该工作。为什么呢?



我正在调试Oracle 19c中的查询,该查询试图通过查询中的字段对SELECT DISTINCT结果进行排序。(注意:这是错误的做法。)

这个查询试图返回一个唯一的客户名称列表,以最近的销售日期排序。它返回一个预期的错误,"ORA-01791: not a SELECTed expression"。

SELECT DISTINCT CUSTOMER_NAME
FROM SALES
ORDER BY LAST_SALE_DATE DESCENDING;

返回错误,因为查询试图按未选择的字段对结果排序。到目前为止这是有意义的。

但是,如果我只是将FETCH FIRST 6 ROWS ONLY添加到查询中,则不会返回错误(尽管结果不正确,因此不要这样做)。但问题是为什么Oracle不返回错误消息?
SELECT DISTINCT CUSTOMER_NAME
FROM SALES
ORDER BY LAST_SALE_DATE DESCENDING
FETCH FIRST 6 ROWS ONLY;

为什么添加FETCH FIRST 6 ROWS ONLY使此工作?

添加:如果有多个具有相同名称和日期的记录,则错误的查询将返回重复。查询类似"sql select distinct order by another column"的语句;下面将展示几种正确的方法。

解释计划查询显示正在发生什么。

解析器重写了fetch...子句—它将解析row_number添加到select列表中,并对行号使用带有过滤器的外部查询。它将unique指令(来自selectdistinct指令)推入子查询,这不是有效的转换;我认为这是一个明显的错误在Oracle实现fetch....

解释计划显示了解析器创建内联视图的步骤,它在其中应用unique并添加解析row_number()。它不显示投影(视图中包含哪些列),也不显示应用unique的内容。经过一些实验,我们得出了答案:它将unique应用于组合customer_namelast_sales_date.

有可能在最近的版本中已经报告并修复了这个问题-你的Oracle版本是什么?

最新更新