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 が作成されます。次に、外側のクエリは、エラーが発生することなく、式 ROUND(avg_time * cnt, 2) で使用される別名 avg_time を含む列をサブクエリから選択します。
以上が同じ SELECT ステートメント内で列のエイリアスを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。