Answers:
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 ;
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的MySQL之外,其他都没有(不足为:上述查询可以工作,但是引擎不会检查功能依赖关系,其他写得不好的查询将显示错误的半随机结果)。
正如@Mark Byers在评论中告知我们的那样,PostgreSQL 9.1添加了为此目的而设计的新功能。它比MySQL的实施更具限制性。
除了@ypercube的变通办法之外,“键入”绝不是使用的借口SELECT *
。我在这里已经写过有关此内容的信息,即使有解决方法,我认为您的SELECT
列表仍应包含列名-即使有大量的数字(如40)。
简而言之,您可以通过在对象资源管理器中单击对象的“列”节点并将其拖动到查询窗口中来避免键入这些大列表。屏幕截图显示了一个视图,但是可以对表执行相同的操作。
但是,如果你想了解的所有原因,为什么你应该服从自己这个巨大的拖动某一项几英寸的努力程度,请阅读我的文章。:-)
SELECT *
,然后从视图定义中复制字段列表。
SELECT *
不应使用。我对此很好奇GROUP BY
。@Aaron,在“分组依据”列表中有40列是否存在效率问题?
A.PK, A.some, A.other, A.columns
并没有麻烦,实际上some, other, columns
只是语法需要比较 。
GROUP BY
在条款SELECT
清单,但它留下它不确定哪个行该值将来自(所以如果列或表达式ISN在功能上不依赖于分组表达式,那么它可以来自组内的任何行)。