避免SQL GROUP BY和ORDER BY子句中命名衝突的技巧
在涉及多個列的組合和排序的SQL查詢中,GROUP BY
和ORDER BY
子句中使用的列名需要仔細考慮,因為SQL語言中輸出列名和來源列名之間可能存在命名衝突。
例如,一個查詢的目標是按硬體型號(name)、嘗試類型(type)和二進位結果(result簡化為0或1)對資料進行分組。然而,預期的輸出結果是每個型號只顯示type和case唯一組合的一行。
問題源自於在GROUP BY
和CASE
表達式中都使用了來源列名result
。 SQL標準規定,在這種情況下,GROUP BY
將result
解釋為來源列名,而ORDER BY
則將其解釋為輸出列名。
為了解決此衝突並獲得預期的輸出,有以下幾種方法:
CASE
<code class="language-sql">... CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1 ... GROUP BY model.name, attempt.type, result1 ...</code>
<code class="language-sql">... GROUP BY 1, 2, 3 ...</code>
GROUP BY
<code class="language-sql">SELECT model.name , attempt.type , CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result , CURRENT_DATE - 1 AS day , count(*) AS ct FROM attempt JOIN prod_hw_id USING (hard_id) JOIN model USING (model_id) WHERE ts >= '2013-11-06 00:00:00' AND ts < '2013-11-07 00:00:00' GROUP BY 1, 2, 3 ORDER BY 1, 2, 3;</code>
以上是如何避免 SQL GROUP BY 和 ORDER BY 子句中的命名衝突?的詳細內容。更多資訊請關注PHP中文網其他相關文章!