2013-07-16 81 views
2

在oracle數據庫上,Table.*表示法在'select..group by ..'查詢中不起作用。表。*表示法在'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

什麼問題? – bendataclear

+2

與MySQL不同的是,大多數數據庫系統都會拒絕這一點 - 他們不知道爲什麼「其他」列中沒有包含在「GROUP BY」中的值應該是「SUM()」?以'AVG()'?給MIN()或MAX()'?等等。請記住,表格是無序的,所以我沒有在該列表中包含「第一個」或「最後一個」,因爲這需要更多的信息添加到問題和查詢中。 –

+1

這是正常行爲,您從哪裏知道這會起作用? – Kermit

回答

3

是的,有一種變通方法。
假設A中的每個ID都是唯一的,那麼你甚至不需要通過使用組,只需:

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

如果ID沒有在表中唯一的,那麼你可以用這個查詢模擬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文檔一個鏈接,將其推廣到GROUP BY解釋:http://dev.mysql.com/doc/refman/5.1/en/group-by-extensions.html
注重此片段:

您可以使用此功能通過避免 不必要的列排序和分組來獲得更好的性能。但是,這主要是當 GROUP BY中每個未組合的每個非聚合列中的所有值對於每個組都相同時有用 。服務器可以自由選擇每個組中的任何值 ,因此除非它們相同,否則所選的值爲 是不確定的。此外,從每個組中選擇 的值不能通過添加ORDER BY子句來影響。排序 在選擇值後發生,並且ORDER BY 不會影響服務器選擇的每個組內的哪些值。

3

按表達式分組必須包含您選擇的所有列。因此,如果表格有3列(column1,column2和column3),則必須按照如下方式對所有人進行分組:group by Column1,Column2,Column3。 *表示您選擇所有列,所以將它們全部按表達式添加到組中。除了agregate功能(MIN, MAX, SUM, AVG, COUNT...)你選擇

9

一切都必須在Group by

+0

有沒有解決方法來重寫沒有列名稱的查詢?我希望查詢在向表中添加新列時保持不變。 – kgautron

+1

+1 @slavoo,但有一些例外:常量值,SYSDATE,分組函數,如GROUP_ID和GROUPING,再加上幾個我確信我忘記了。 –