Sekatan menggunakan alias lajur secara langsung untuk pengiraan dalam pertanyaan SQL
Dalam pertanyaan SQL yang diberikan, cuba menggunakan alias lajur ROUND(avg_time * cnt, 2)
dan avg_time
dalam ungkapan cnt
menghasilkan ralat "Lajur 'avg_time' tidak wujud".
Punca utama terletak pada susunan penilaian pernyataan SELECT
. Atur cara memproses keseluruhan penyataan SELECT
secara serentak, jadi nilai alias tidak dapat dikenali pada masa itu.
Penyelesaian: Gunakan subkueri bersarang
Untuk menyelesaikan masalah ini, pertanyaan boleh dirangkumkan menggunakan subkueri, dengan berkesan mencipta set data perantaraan. Dalam subkueri ini, anda boleh mencipta alias lajur yang diperlukan avg_time
dan cnt
.
<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>
Kini, apabila melaksanakan pertanyaan ini, subkueri dinilai terlebih dahulu, menghasilkan set data yang mengandungi alias lajur yang diperlukan. Kenyataan SELECT
seterusnya boleh berjaya merujuk alias ini.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Menggunakan Alias Lajur Secara Terus dalam Pengiraan Penyata SELECT yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!