我正在调试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
指令(来自select
的distinct
指令)推入子查询,这不是有效的转换;我认为这是一个明显的错误在Oracle实现fetch...
.
解释计划显示了解析器创建内联视图的步骤,它在其中应用unique
并添加解析row_number()
。它不显示投影(视图中包含哪些列),也不显示应用unique
的内容。经过一些实验,我们得出了答案:它将unique
应用于组合customer_name
和last_sales_date
.
有可能在最近的版本中已经报告并修复了这个问题-你的Oracle版本是什么?