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

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

Patricia Arquette
Patricia Arquette原创
2025-01-10 14:59:44180浏览

How to Resolve Naming Conflicts in SQL GROUP BY and ORDER BY Clauses?

SQL GROUP BYORDER BY 子句命名冲突:解决方案

由于计算的 CASE 表达式列和源列 (attempt.result) 之间的命名冲突,原始查询在按硬件型号、结果类型和案例对数据进行分组时遇到问题。 这会导致相同类型和大小写组合出现多行。

解决方案在于避免在 GROUP BY 子句中直接使用源列名称。 这里有两个有效的方法:

方法一:直接按CASE表达式分组:

不要按 attempt.result 分组,而是按 CASE 表达式本身分组:

<code class="language-sql">GROUP BY model.name, attempt.type, CASE WHEN attempt.result = 0 THEN 0 ELSE 1 END</code>

这直接根据CASE语句的计算结果对数据进行分组,消除了歧义。

方法2:使用列别名:

CASE 表达式的输出列指定别名:

<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>

别名result1清楚地区分了计算列和源列,解决了冲突。 请注意,在这种情况下,ORDER BY 将优先考虑别名列名称 (result1)。

最佳实践:位置参考

为了完全避免命名冲突,请在 GROUP BYORDER BY 子句中使用位置引用。这种方法不太容易出错,并且提高了查询的可读性,尤其是在复杂的查询中。 下面的示例在简化和重写的查询中演示了此技术:

<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 < CURRENT_DATE  --Corrected the incomplete WHERE clause
GROUP BY 1, 2, 3  -- Positional references for model.name, a.type, result
ORDER BY 1, 2, 3  -- Positional references for model.name, a.type, result</code>

此修改后的查询更加简洁,并避免了潜在的命名冲突。 请记住始终检查您的 WHERE 子句的完整性。 原文不完整,以上已更正。

以上是如何解决 SQL GROUP BY 和 ORDER BY 子句中的命名冲突?的详细内容。更多信息请关注PHP中文网其他相关文章!

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