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的实现更具限制性. (编辑:青岛站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |