SQL 查詢中列別名無法在相同 SELECT 語句中重複使用的解釋
在給定的 SQL 查詢中,嘗試在 SELECT 語句之後的一個表達式 (ROUND(avg_time * cnt, 2)) 中使用列別名 (avg_time 和 cnt)。但是,這會引發錯誤,因為列別名在後續的 SELECT 表達式中是無法存取的。
這個限制源自於 SQL 引擎處理查詢的順序。 SELECT 語句首先執行,在此階段建立別名。但是,後續表達式稍後處理,此時別名尚未定義。
解:使用子查詢
為了解決此限制,可以使用子查詢。子查詢是在另一個查詢中嵌入的單獨查詢。在這種情況下,可以使用子查詢來建立別名,然後在外層查詢中存取它們。
以下查詢使用子查詢來封裝原始查詢,並使列別名在外層可用:
<code class="language-sql">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;</code>
在此查詢中,子查詢(括號內)會建立列別名 stddev_time、max_time、avg_time、min_time 和 cnt。然後,外層查詢從子查詢中選擇列,包括別名 avg_time,它在表達式 ROUND(avg_time * cnt, 2) 中使用,不會遇到任何錯誤。
以上是為什麼不能在同一個 SELECT 語句中使用列別名?的詳細內容。更多資訊請關注PHP中文網其他相關文章!