我正在除錯 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”之類的內容將顯示幾種正確的方法。
uj5u.com熱心網友回復:
查詢的解釋計劃顯示正在發生的事情。
決議器重寫了該fetch...子句——它將分析添加row_number到select串列中,并使用帶有行號過濾器的外部查詢。它將unique指令(distinct來自 your 的指令select)推送到子查詢中,這不是有效的轉換;我認為這是Oracle 實作中的一個明顯錯誤fetch...。
解釋計劃顯示了決議器創建應用的行內視圖unique并添加 analytic的步驟row_number()。它不顯示投影(視圖中包含哪些列),并且 - 關鍵 - 它適用unique于什么。一些實驗表明了答案:它適用于和unique的組合。customer_namelast_sales_date
這可能已在最近的版本中被報告并且可能已修復 - 您的 Oracle 版本是什么?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466330.html
