首页 >数据库 >mysql教程 >如何避免 SQL GROUP BY 和 ORDER BY 子句中的命名冲突?

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

Barbara Streisand
Barbara Streisand原创
2025-01-10 14:51:43577浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn