加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-30 20:30:49 所属栏目:MsSql教程 来源:网络整理
导读:我试图使以下SQL语句工作,但我得到一个语法错误: SELECT A.*,COUNT(B.foo)FROM TABLE1 ALEFT JOIN TABLE2 B ON A.PKey = B.FKeyGROUP BY A.* 这里,A是一个包含40列的宽表,我希望尽可能避免在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的实现更具限制性.

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读