一尘不染

为什么SQL迫使我在GROUP BY子句中重复执行SELECT子句中所有未聚合的字段?

sql

这困扰了我很长一段时间。

99%的时间,GROUP BY子句是SELECT子句的精确副本,减去聚合函数(MAX,SUM等)。
这违反了“不要重复自己”的原则。

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

编辑

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

谢谢。


阅读 135

收藏
2021-03-17

共1个答案

一尘不染

我倾向于同意您的看法-这是许多情况下SQL应该具有更聪明的默认值以节省我们所有键入内容的情况之一。例如,想象一下这是否合法:

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

其中“”表示“所有非聚合字段”。如果每个人都知道这是如何工作的,那么就不会造成混乱。如果您想做一些棘手的事情,可以在一个特定的字段列表中查找子项,但是splat表示“全部”(在此情况下,表示所​​有
可能* 的)。

当然,“ *”在这里的含义与SELECT子句中的有所不同,因此使用不同的字符可能会更好:

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

像SQL这样的其他一些领域并没有那么雄辩。但是在这一点上,它可能已经根深蒂固,无法进行许多重大更改。

2021-03-17