ISOANSI SQL和GROUP BY语句

  Oracle9i文档中说他们现在也支持“E051-04”的特征(比如,就象Transact-SQL一样)。DB27指出“group by”必须有一个可以在“select”中(SQL92请求)的列名。DB2 8对于“group by”的限制减少了,它允许更一般的“grouping-expression”作为“group by”的参数(但并没有指出这是E051-04的特征),我想这些都是理论上的,对我来说,想知道的是哪种“group by”语句是最有可能移植的(因为SQL:1999的“内核”支持)。

  以我的观点,问题比实际的要复杂的多,因为E051-04的描述太笼统了,而且也含糊不清(它只是说 GROUP BY可以包含的而不在select list中的列—但它们并没有指出它们来自于哪里(原始“from”表?,即便是这样,那么在马上建立子表后,这个表还在吗?)。

  坦率地说,好大的一个问题。你的目的是怎么运行,还是将怎么样运行,还是可能运行?不过可以说,你的可移植性的考虑的确是写好数据库应用或陷入烦琐的设计必须需要的内在的一种审视。

  所以,在这里提到MySQL怪异的对GROUP BY的支持显然不是太好,MySQL允许在一个grouping SQL语句中使用“隐藏域”,允许你在GROUP BY中忽略列,但这些列必须保存在SELECT中,他们解释了这是怎么工作的,并给出了允许这种语法的理由,文档在“12.9.3 GROUP BY with Hidden Fields”,其警告有:如果你从GROUP BY中忽略的列在这个“group”中并不唯一,那么不要使用这个特征,否则你会得到不可预测的结果。

  这个警告过去是用黑体字来标出的,现在他们好象语气缓和了许多,注意声明语句中的强调。

  但你问的是个相反的情况:不在SELECT中但在GROUP BY中的某个列,GROUP BY a,b,c但在SELECT中忽略c可以吗?

  我的建议可能不值一提,不过是来自于实践,而不是理论(如果你需要标准的,你可能应该找Joe Celko,我关于标准的知识和他的完全不同)。我的建议是你可以写你自己的SQL,以便它可以在你所期望的数据库上运行。记住它至少应该遵循某个已经出版的标准,并且使用在后来的版本中没有废弃的语法。如果有疑问的话,请使用Mimer Validator.

  那么,写一个不在SELECT中列的“GROUP BY”就可以了吗?如果你从不同的数据库中得出不同的结果,并且如果移植性上出问题了,那么答案

相关阅读