首页 > 数据库 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板