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中文网其他相关文章!