2017-01-27 176 views
1

只是好奇为什么我真的必须指定一个group by子句,因为如果我使用一个函数,那些请求者一个group by子句(不记得那些函数的通用名称),例如。和()。meta:为什么我必须指定一个group by子句

因为如果我使用其中之一,我必须指定在group by子句中不使用其中一列的每一列。

为什么sql不会自动将所有不使用聚合函数的列分组?这似乎是多余的,因为只要我使用聚合,我在所有其他不使用它的列上进行分组。

+0

我会想象避免意外的行为,让用户更容易。但是,对于给定的SQL悠久的历史以及您无法真正做任何事情来改变当前的情况,您并不是真的会得到合适的答案。 – iamdave

+0

是的。只是想知道是否有人可以证明tsql语言的设计选择。有没有什么地方我不必指定我的分组列? – user3532232

+0

你*总是*必须指定你的分组列。 – iamdave

回答

1

可能出于同样的原因,C编译器不会自动假定并插入变量声明(如果使用的是以前未声明的变量声明)。有编程语言可以完成这种事情,SQL不是其中之一。

另一方面,编辑可能会意识到这一点,并至少自动完成语法的功能相关部分。默认情况下,Oracle SQL开发人员在检测到您正在编写需要它的选择列列表时,会默认自动附加GROUP BY子句。海事组织这是一个痛苦,我通常保持关闭,但它会尽可能 - 在IDE /编辑器级别。

编辑:根据您最近的评论,在MySQL(不是微软的T-SQL)中有一个选项,旨在通过实现标准SQL99的可选功能T301来放宽规则。我认为这正是你所追求的:

MySQL 5.7.5及更高版本实现检测功能依赖。如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL会拒绝选择列表,HAVING条件或ORDER BY列表引用既未在GROUP BY子句中命名也未在功能上依赖于它们的非聚合列的查询。

来源:https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

找不到对T-SQL的未来版本中此功能的状态多的信息,虽然。唯一的参考是this,与T-SQL将“部分支持此功能”的含义非常模糊。

+0

好的。很酷,知道你不需要它在MySQL中。没有什么,我真的很困扰它,似乎是在语言中的冗余设计 – user3532232

相关问题