2012-07-20 64 views
0

在MySQL有以下MySQL的像甲骨文GROUPBY我如何

drop table tab1; 
CREATE TEMPORARY TABLE tab1 
(col1 integer,col2 integer(10),col3 varchar(10),col4 integer)engine=memory 
insert into tab1 
values(100,1,'Hello',9); 
insert into tab1 
values(200,1,'HelloWrld',8); 
insert into tab1 
values(300,1,'HelloTher',7); 
insert into tab1 
values(400,2,'HiThere',6); 
insert into tab1 
values(500,3,'Howdy',5); 
insert into tab1 
values(600,3,'Hiya',4); 

select col1,col2,col3,col4,min(col4) 
from tab1 
group by col2 

'100', '1', 'Hello', '9', '7' 
'400', '2', 'HiThere', '6', '6' 
'500', '3', 'Howdy', '5', '4' 

結果在Oracle沿fdllowing查詢我想同樣的結果在MySQL

with tab1 as (
select 100 col1, 1 col2, 'Hello' col3,9 col4 from dual 
union all 
select 200 col1, 1 col2, 'HelloWrld' col3,8 col4 from dual 
union all 
select 300 col1, 1 col2, 'HelloTher' col3,7 col4 from dual 
union all 
select 400 col1, 2 col2, 'HiThere' col3,6 col4 from dual 
union all 
select 500 col1, 3 col2, 'Howdy' col3,5 col4 from dual 
union all 
select 600 col1, 3 col2, 'Hiya' col3,4 col4 from dual 
) 
select min(col1),col2,min(col3),col4,min(col4) 
from tab1 
group by col2,col4 

Result I get is this 
MIN(COL1)  COL2 MIN(COL3)  COL4 MIN(COL4) 
---------- ---------- --------- ---------- ---------- 
     100   1 Hello    9   9 
     200   1 HelloWrld   8   8 
     500   3 Howdy    5   5 
     600   3 Hiya    4   4 
     300   1 HelloTher   7   7 
     400   2 HiThere   6   6 

我想什麼有這是

'100', '1', 'Hello', '9', '7' 
'400', '2', 'HiThere', '6', '6' 
'500', '3', 'Howdy', '5', '4' 

我如何實現Mysql像gro在 我無法得到這,這是我想解決的長查詢

+3

MySQL的結果是[indeterminate](http://dev.mysql.com/doc/refman/5.1/en/group-by-hidden-columns.html) 。 – 2012-07-20 15:45:00

+0

你到底在做什麼?這兩個查詢有不同的'group by'子句。你是否想要獲得每列,一列或其他內容的最小值? – 2012-07-20 15:49:05

+0

@MarkByers - 在我看來,這是最糟糕的行爲之一。我想我寧願有一些特殊的語法來表示(比如說'GROUP BY col1,HIDDEN(col2)'或其他),以使行爲更加明確。事實上,如果你錯誤地輸入了一些東西,你的結果可能會很糟糕,甚至不會提示你。 – 2012-07-20 15:51:10

回答

1

假設你的目的是要獲得一個確定的結果(不同於MySQL的結果是不確定的),而col1 - 要保留col4數據是對於給定的col2最小col1值的行數據值,您可以使用分析函數

SQL> ed 
Wrote file afiedt.buf 

    1 with tab1 as (
    2 select 100 col1, 1 col2, 'Hello' col3,9 col4 from dual 
    3 union all 
    4 select 200 col1, 1 col2, 'HelloWrld' col3,8 col4 from dual 
    5 union all 
    6 select 300 col1, 1 col2, 'HelloTher' col3,7 col4 from dual 
    7 union all 
    8 select 400 col1, 2 col2, 'HiThere' col3,6 col4 from dual 
    9 union all 
10 select 500 col1, 3 col2, 'Howdy' col3,5 col4 from dual 
11 union all 
12 select 600 col1, 3 col2, 'Hiya' col3,4 col4 from dual 
13 ) 
14 select col1, 
15   col2, 
16   col3, 
17   col4, 
18   min_col4 
19 from (select col1, 
20     col2, 
21     col3, 
22     col4, 
23     min(col4) over (partition by col2) min_col4, 
24     rank() over (partition by col2 order by col1) rnk 
25   from tab1) 
26* where rnk = 1 
SQL>/

     COL1  COL2 COL3   COL4 MIN_COL4 
---------- ---------- --------- ---------- ---------- 
     100   1 Hello    9   7 
     400   2 HiThere   6   6 
     500   3 Howdy    5   4 
+0

嗨賈斯汀什麼是非確定性的如果運行查詢兩次我不會得到相同的結果這是你的意思 – 2012-07-20 16:09:06

+0

@ jhon.smith - 有可能得到不同的結果,是的。實際上,如果在沒有對錶格進行任何更改時運行查詢兩次,則可能會得到相同的結果。但最終,你可能會得到不同的結果。這可能會在明天發生,可能會在一年後發生,當您升級數據庫時可能會發生這種情況。 – 2012-07-20 16:18:24

+0

賈斯汀我必須標記你的答案是正確的希望stackoverflow允許我標記兩個正確的答案,因爲馬克·拜爾斯在技術上是正確的也不會從馬克獲得信貸 – 2012-07-20 16:22:52

2

的一部分根據mysql文檔,組中未指定列的結果可以來自任何行。

所以,甲骨文完全合理查詢:

select min(col1),col2,min(col3),min(col4),min(col4) 
from tab1 
group by col2 

如果你的MySQL代碼是依賴於一個特定的值被選中,則該代碼被打破。你需要弄清楚你想要什麼,並找出如何在Oracle中獲得。