表。*表示法在'group by'查询中不起作用

时间:2013-07-16 14:46:38

标签: sql oracle

在oracle数据库中,Table.*表示法在'select..group by ..'查询中不起作用。

此查询没有*工作:

select A.id from TABLE_A A INNER JOIN TABLE_B B on A.id=B.aid group by A.id

这个带*的不会:

select A.*  from TABLE_A A INNER JOIN TABLE_B B on A.id=B.aid group by A.id

输出

00979. 00000 -  "not a GROUP BY expression"

为什么此查询不起作用?有一个简单的解决方法吗?

3 个答案:

答案 0 :(得分:8)

除了汇总功能(MIN, MAX, SUM, AVG, COUNT...)之外,您选择的所有内容都必须位于Group by

答案 1 :(得分:3)

group by表达式必须包含您选择的所有列。因此,如果表有3列(column1,column2和column3),则必须按以下方式对所有列进行分组:group by Column1,Column2,Column3。 *表示您选择所有列,因此请按表达式在组中添加所有列。

答案 2 :(得分:3)

是的,有一种解决方法 假设A中的每个id都是唯一的,那么您甚至不需要使用group by,只需:

select * from A
where id in (
   select id from b
); 

如果id在A表中不是唯一的,那么您可以使用此查询模拟MySql功能:

select * from A
where rowid in (
  select min( a.rowid ) 
  from a
  join b on a.id = b.id
  group by a.id
);

以下是SQL Fiddle demo

的链接 以下是MySql文档的链接,其中解释了他们对分组的扩展名:http://dev.mysql.com/doc/refman/5.1/en/group-by-extensions.html
注意这个片段:

  

您可以通过避免使用此功能来获得更好的性能   不必要的列排序和分组。但是,这很有用   主要是当每个非聚合列中的所有值都未命名时   GROUP BY对于每个组都是相同的。服务器可以自由选择   每个组中的任何值,因此除非它们相同,否则为值   选择是不确定的。此外,从中选择值   添加ORDER BY子句不会影响每个组。排序   结果集的选择在选择值和ORDER BY之后发生   不会影响服务器选择的每个组中的哪些值。