sql-server – 为什么GROUP BY语句中的通配符不起作用?

前端之家收集整理的这篇文章主要介绍了sql-server – 为什么GROUP BY语句中的通配符不起作用?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使以下sql语句工作,但我得到一个语法错误
SELECT A.*,COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.*

这里,A是一个包含40列的宽表,我希望尽可能避免在GROUP BY子句中列出每个列名.我有很多这样的表,我必须运行类似的查询,所以我将不得不写一个存储过程.什么是最好的方法解决这个问题?

我正在使用MS sql Server 2008.

解决方法

sql中不允许使用GROUP BY A. *.

您可以通过使用分组所在的子查询来绕过此,然后加入:

SELECT A.*,COALESCE(B.cnt,0) AS Count_B_Foo
FROM TABLE1 AS A
  LEFT JOIN 
      ( SELECT FKey,COUNT(foo) AS cnt
        FROM TABLE2 
        GROUP BY FKey
      ) AS B 
    ON A.PKey = B.FKey ;

sql-2003标准中有一个功能,即在SELECT列表中允许不在GROUP BY列表中的列,只要它们在功能上依赖于它们.如果该功能已在sql-Server中实现,则您的查询可能已写为:

SELECT A.*,COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.pk                          --- the Primary Key of table A

不幸的是,这个功能还没有实现,甚至在sql-Server 2012版本中也没有实现 – 据我所知,并没有在任何其他DBMS中实现.除了拥有它但却不充分的MysqL之外(不充分地:上述查询将起作用但引擎不会检查功能依赖性,其他错误编写的查询显示错误的,半随机结果).

正如@Mark Byers评论中告知我们的那样,PostgreSQL 9.1 added a new feature就是为此而设计的.它比MysqL的实现更具限制性.

猜你在找的MsSQL相关文章