GROUP BY按object_id分组未报错?不符合SQL规则的技术疑问
为什么你的SQL语句没报错?
1. SQL Server的GROUP BY规则有弹性
官方文档提到的“非聚合表达式列必须包含在GROUP BY列表中”并非绝对刚性规则,当查询优化器能够明确判定SELECT中的表达式完全由GROUP BY的列唯一决定时,会允许这种写法而不触发报错。
2. object_id与OBJECT_NAME(object_id)的依赖关系
在同一数据库范围内,object_id是数据库对象的唯一标识符,每个object_id必然对应唯一的OBJECT_NAME(object_id)结果。尽管对象名可能存在重复(不同架构或数据库下可以有同名对象),但你是按object_id分组,每个分组的object_id唯一,因此对应的对象名是确定且唯一的,优化器能识别这种单向的唯一依赖关系。
3. 系统函数的特殊处理
OBJECT_NAME()是SQL Server内置的系统函数,查询优化器对这类系统函数与系统列的绑定关系有内置认知,明确知道OBJECT_NAME(object_id)的结果完全由输入的object_id决定,因此不会以“SELECT表达式未在GROUP BY中”为由报错。如果换成自定义函数,哪怕逻辑上存在依赖关系,优化器大概率无法识别,仍会触发报错。
内容的提问来源于stack exchange,提问作者user3779002
相关产品推荐
相关产品推荐

