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 的实现更具限制性。
| 归档时间: |
|
| 查看次数: |
18403 次 |
| 最近记录: |