当前位置:  开发笔记 > 数据库 > 正文

为什么SQL强迫我在GROUP BY子句中重复SELECT子句中的所有非聚合字段?

如何解决《为什么SQL强迫我在GROUPBY子句中重复SELECT子句中的所有非聚合字段?》经验,为你挑选了2个好方法。

这已经困扰了我很长一段时间.

99%的时候,GROUP BY子句是SELECT子句的精确副本,减去了聚合函数(MAX,SUM等).
这打破了"不要重复自己"的原则.

什么时候GROUP BY子句不能包含SELECT子句的精确副本减去聚合函数?

编辑

我意识到一些实现允许你在GROUP BY中使用不同于SELECT的字段(因此99%,而不是100%),但这肯定是一个非常小的例外?
如果您使用不同的字段,有人可以解释应该返回的内容吗?

谢谢.



1> Ian Varley..:

我倾向于同意你的观点 - 这是SQL应该有一些更智能的默认设置来保存我们所有打字的情况之一.例如,假设这是合法的:

Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By *

其中"*"表示"所有非聚合字段".如果每个人都知道它是如何工作的,那么就不会有混淆.如果你想做一些棘手的事情,你可以在一个特定的字段列表中进行分析,但是splat意味着"所有'em'(在这个上下文中意味着所有可能的).

当然,"*"在这里意味着与SELECT子句不同的东西,所以也许一个不同的角色可以更好地工作:

Select ClientName, InvoiceAmount, Sum(PaymentAmount) Group By !

还有一些其他领域,其中SQL并不像它本身那样雄辩.但在这一点上,它可能已经根深蒂固地做出了许多重大改变.



2> Binary Worri..:

因为它们是两个不同的东西,所以您可以按照不在select子句中的项目进行分组

编辑:

此外,做出这个假设是否安全?

我有一个SQL语句

Select ClientName, InvAmt, Sum(PayAmt) as PayTot

服务器假设我想按ClientName和InvoiceAmount进行分组是否"正确"?我个人更喜欢(并认为它更安全)拥有此代码

Select ClientName, InvAmt, Sum(PayAmt) as PayTot
Group By ClientName

抛出错误,提示我将代码更改为

Select ClientName, Sum(InvAmt) as InvTot, Sum(PayAmt) as PayTot
Group By ClientName


隐含操作是调试和测试的祸根.
推荐阅读
ERIK又
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有