我试图使以下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的实现更具限制性.