SQL 查詢中直接使用列別名進行計算的限制
在給定的 SQL 查詢中,嘗試在表達式 ROUND(avg_time * cnt, 2)
中使用列別名 avg_time
和 cnt
會導致錯誤“列“avg_time”不存在”。
根本原因在於 SELECT
語句的計算順序。程序同時處理整個 SELECT
語句,因此在那個時間點無法識別別名值。
解決方案:使用嵌套子查詢
為了解決這個問題,可以使用子查詢來封裝查詢,從而有效地創建一個中間數據集。在這個子查詢中,可以創建所需的列別名 avg_time
和 cnt
。
SELECT stddev_time, max_time, avg_time, min_time, cnt, ROUND(avg_time * cnt, 2) as slowdown
FROM (
SELECT
COALESCE(ROUND(stddev_samp(time), 2), 0) as stddev_time,
MAX(time) as max_time,
ROUND(AVG(time), 2) as avg_time,
MIN(time) as min_time,
COUNT(path) as cnt,
path
FROM
loadtime
GROUP BY
path
ORDER BY
avg_time DESC
LIMIT 10
) X;
現在,執行此查詢時,會先計算子查詢,生成包含所需列別名的數據集。然後,後續的 SELECT
語句就可以成功引用這些別名了。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3