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

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

Patricia Arquette
發布: 2025-01-10 14:46:42
原創
184 人瀏覽過

How to Avoid Naming Conflicts in SQL's GROUP BY and ORDER BY Clauses?

SQL GROUP BYORDER BY 子句中的欄位名稱

問題:

在SQL中分組資料時,必須在GROUP BYORDER BY子句中指定正確的列名。如果輸入列和輸出列之間存在命名衝突,則可能導致結果不正確。

解:

GROUP BY 子句

  • 避免使用來源列名: 不要直接使用來源列名(例如attempt.result)進行分組。應使用確定所需結果的CASE表達式進行分組。這確保您按正確的值進行分組。

    <code class="language-sql">  GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>
    登入後複製
  • 使用列別名: 如果你更傾向於使用原始列名,請在SELECT列表中提供不同的別名。這可以防止輸出列幹擾分組。

    <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>
    登入後複製

ORDER BY 子句

  • 使用位置引用: 不要直接引用輸出列名,而應在ORDER BY子句中使用位置引用(序數)。這避免了任何潛在的命名衝突。

    <code class="language-sql">  ORDER BY 1, 2, 3</code>
    登入後複製

範例:

使用正確的JOIN語法、位置引用和解決命名衝突的重寫查詢:

<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 <  '2013-11-07 00:00:00'
GROUP  BY 1, 2, 3
ORDER  BY 1, 2, 3;</code>
登入後複製

以上是如何避免 SQL 的 GROUP BY 和 ORDER BY 子句中的命名衝突?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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