SQL GROUP BY
和 ORDER BY
子句命名衝突:解決方案
由於計算的 CASE
表達式列和來源列 (attempt.result
) 之間的命名衝突,原始查詢在按硬體型號、結果類型和案例對資料進行分組時遇到問題。 這會導致相同類型和大小寫組合出現多行。
解決方案在於避免在 GROUP BY
子句中直接使用來源列名稱。 這裡有兩個有效的方法:
方法一:直接依CASE表達式分組:
不要按 attempt.result
分組,而是按 CASE
表達式本身分組:
<code class="language-sql">GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>
這直接根據CASE
語句的計算結果對資料進行分組,消除了歧義。
方法2:使用列別名:
為 CASE
表達式的輸出列指定別名:
<code class="language-sql">SELECT ..., CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END AS result1 GROUP BY model.name, attempt.type, result1</code>
別名result1
清楚地區分了計算列和來源列,解決了衝突。 請注意,在這種情況下,ORDER BY
將優先考慮別名列名稱 (result1
)。
最佳實務:位置參考
為了完全避免命名衝突,請在 GROUP BY
和 ORDER BY
子句中使用位置引用。這種方法不太容易出錯,並且提高了查詢的可讀性,尤其是在複雜的查詢中。 下面的範例在簡化和重寫的查詢中示範了此技術:
<code class="language-sql">SELECT m.name, a.type, CASE WHEN a.result = 0 THEN 0 ELSE 1 END AS result, CURRENT_DATE - 1 AS day, count(*) AS ct FROM attempt a JOIN prod_hw_id p USING (hard_id) JOIN model m USING (model_id) WHERE ts >= '2013-11-06 00:00:00' AND ts < CURRENT_DATE --Corrected the incomplete WHERE clause GROUP BY 1, 2, 3 -- Positional references for model.name, a.type, result ORDER BY 1, 2, 3 -- Positional references for model.name, a.type, result</code>
此修改後的查詢更加簡潔,並避免了潛在的命名衝突。 請記住始終檢查您的 WHERE
子句的完整性。 原文不完整,以上已更正。
以上是如何解決 SQL GROUP BY 和 ORDER BY 子句中的命名衝突?的詳細內容。更多資訊請關注PHP中文網其他相關文章!