首頁 > 資料庫 > mysql教程 > 如何解決 SQL GROUP BY 和 ORDER BY 子句中的命名衝突?

如何解決 SQL GROUP BY 和 ORDER BY 子句中的命名衝突?

Patricia Arquette
發布: 2025-01-10 14:59:44
原創
179 人瀏覽過

How to Resolve Naming Conflicts in SQL GROUP BY and ORDER BY Clauses?

SQL GROUP BYORDER 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 BYORDER 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板