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

Ano*_*mus 31 sql-server-2008 sql-server t-sql group-by

我正在尝试使以下 SQL 语句起作用,但出现语法错误:

SELECT A.*, COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.*
Run Code Online (Sandbox Code Playgroud)

这里,A 是一个有 40 列的宽表,如果可能,我想避免在 GROUP BY 子句中列出每个列名。我有很多这样的表,我必须在这些表上运行类似的查询,所以我必须编写一个存储过程。解决这个问题的最佳方法是什么?

我正在使用 MS SQL Server 2008。

ype*_*eᵀᴹ 33

GROUP BY A.* 在 SQL 中是不允许的。

您可以通过使用分组依据的子查询来绕过此问题,然后加入:

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 ;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

不幸的是,此功能尚未实现,甚至在 SQL-Server 2012 版本中也没有实现——据我所知,在任何其他 DBMS 中也没有实现。除了 MySQL 有它但不充分(不足为:上述查询可以工作,但引擎不会检查功能依赖性,其他写得不好的查询将显示错误的半随机结果)。

正如@Mark Byers在评论中告诉我们的那样,PostgreSQL 9.1 添加了一个专为此目的而设计的新功能。它比 MySQL 的实现更具限制性。

  • “据我所知,不在任何其他 DBMS 中。” PostgreSQL 9.1 添加了一个专门用于此目的的[新功能](http://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.1#SQL_and_PL.2FPgSQL_features)。它比 MySQL 的实现更具限制性。 (3认同)

Aar*_*and 24

除了@ypercube 的解决方法之外,“打字”绝不是使用SELECT *. 我在这里写过这个,即使有解决方法,我认为你的SELECT列表仍然应该包括列名——即使有像 40 这样的大量数字。

长话短说,您可以通过在对象资源管理器中单击对象的列节点并将其拖到查询窗口上来避免输入这些大列表。屏幕截图显示了一个视图,但可以对表执行相同的操作。

在此处输入图片说明

但是如果你想了解为什么你应该让自己承受将一个项目拖到几英寸的巨大努力的所有原因,请阅读我的帖子。:-)