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

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

Barbara Streisand
發布: 2025-01-10 14:51:43
原創
574 人瀏覽過

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

避免SQL GROUP BY和ORDER BY子句中命名衝突的技巧

在涉及多個列的組合和排序的SQL查詢中,GROUP BYORDER BY子句中使用的列名需要仔細考慮,因為SQL語言中輸出列名和來源列名之間可能存在命名衝突。

例如,一個查詢的目標是按硬體型號(name)、嘗試類型(type)和二進位結果(result簡化為0或1)對資料進行分組。然而,預期的輸出結果是每個型號只顯示type和case唯一組合的一行。

問題源自於在GROUP BYCASE表達式中都使用了來源列名result。 SQL標準規定,在這種情況下,GROUP BYresult解釋為來源列名,而ORDER BY則將其解釋為輸出列名。

為了解決此衝突並獲得預期的輸出,有以下幾種方法:

  1. 使用列別名: 為表達式新增一個別名,確保它與任何來源列名不同。例如: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>
登入後複製
  1. 使用位置引用: 使用數字明確引用SELECT清單中列的位置。例如:
<code class="language-sql">...
GROUP BY 1, 2, 3
...</code>
登入後複製
  1. 包含常數: 雖然常數列(例如,day)不需要包含在中,但為了清晰起見,可以添加它們而不會影響結果。 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中文網其他相關文章!

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