SQL GROUP BY
和 ORDER 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 BY
和 ORDER 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中文网其他相关文章!