避免SQL GROUP BY和ORDER BY子句中命名冲突的技巧
在涉及多个列的组合和排序的SQL查询中,GROUP BY
和ORDER BY
子句中使用的列名需要仔细考虑,因为SQL语言中输出列名和源列名之间可能存在命名冲突。
例如,一个查询的目标是按硬件型号(name)、尝试类型(type)和二进制结果(result简化为0或1)对数据进行分组。然而,期望的输出结果是每个型号只显示type和case唯一组合的一行。
问题源于在GROUP BY
和CASE
表达式中都使用了源列名result
。SQL标准规定,在这种情况下,GROUP BY
将result
解释为源列名,而ORDER BY
则将其解释为输出列名。
为了解决此冲突并获得预期的输出,有以下几种方法:
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>
<code class="language-sql">... GROUP BY 1, 2, 3 ...</code>
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中文网其他相关文章!