SQL GROUP BY
和 ORDER BY
子句中的欄位名稱
問題:
在SQL中分組資料時,必須在GROUP BY
和ORDER 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中文網其他相關文章!