2

在 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"

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

4

3 回答 3

8

除了聚合函数 ( MIN, MAX, SUM, AVG, COUNT...) 之外,您选择的所有内容都必须在Group by

于 2013-07-16T14:50:04.280 回答
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 演示

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

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

于 2013-07-16T15:37:23.360 回答
3

group by 表达式必须包含您选择的所有列。因此,如果表格有 3 列(column1、column2 和column3),您必须像这样按所有列分组:按 Column1、Column2、Column3 分组。* 表示您选择了所有列,因此将它们全部添加到 group by 表达式中。

于 2013-07-16T14:49:49.427 回答