在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"
为什么此查询不起作用?有一个简单的解决方法吗?
答案 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之后发生 不会影响服务器选择的每个组中的哪些值。