2015-02-09 42 views
0

我有這樣的表(說表1):的Oracle SQL:GROUP BY和HAVING子句

ID1 | ID2 | NAME 

其中(ID1,ID2)是複合PK。

而這另一個表(比如表2):

ID | COD1 | COD2 | DATA | INDEX 

其中ID爲PK。

我要加入這個表上((TABLE1.ID1 = TABLE2.COD1) AND (TABLE1.ID2 = TABLE2.COD2))

我的問題是,對於TABLE2的每個ID,我有不同的索引很多元組。我只想加入其INDEX是其組的最大值(COD1,COD2)的元組。

舉例來說,如果我有:

ID1|ID2|NAME 
10 10 JOSH 

ID|COD1|COD2|DATA|INDEX 
1 10 10 YES 0 
2 10 10 NO 1 
3 11 10 OH 0 

我想:

ID1|ID2|NAME|DATA 
10 10 JOSH NO 

我都試過,但它不工作:

SELECT ID1, ID2, NAME, DATA 
FROM TABLE1 T1 JOIN TABLE2 T2 ON T1.ID1 = T2.COD1 AND T1.ID2 = T2.COD2 
GROUP BY ID1, ID2, NAME, DATA HAVING INDEX = MAX(INDEX) 

感謝。

+0

被它給任何錯誤? – varsha 2015-02-09 10:21:15

回答

0

我已經這樣解決了它:

SELECT ... FROM TABLE1 JOIN 
(SELECT ID1, ID2, NAME, DATA 
FROM TABLE1 T1 JOIN TABLE2 T2 ON T1.ID1 = T2.COD1 AND T1.ID2 = T2.COD2 
GROUP BY ID1, ID2, NAME, DATA HAVING INDEX = SELECT MAX(INDEX) FROM TABLE2 WHERE TABLE1.ID1 = TABLE2.COD1 AND TABLE1.ID2 = TABLE2.COD2 

謝謝!

2

這是通用結構。

select field1,field2, etc 
from yourtables 
join 
(select field1, max(something) themax 
from table1 
where whatever 
group by field1) temp on table1.something = themax 
and table1.field1 = temp.field1 
where whatever 

兩個「凡凡達」應該是相同的。你應該可以從這裏拿走它。

0

嘗試

SELECT ID1,ID2,NAME 
FROM TABLE1 
join 
(select ID,DATA, max(Index) themax 
FROM TABLE2 
WHERE (your condition) 
group by ID) temp on table1.Index = themax 
WHERE (your condition) 
1

稍微不同的解決方案:

select t1.id1, t1.id2, t1."NAME", t3."DATA" 
from table1 t1 
left join 
(
    select max("INDEX") as maxindex, cod1, cod2 
    from table2 
    group by cod1, cod2 
) tt on tt.cod1 = t1.id1 and tt.cod2 = t1.id2 
left join table2 t2 on t2."INDEX" = tt.maxindex; 

如果所有元組具有不同的獨特價值指數,這些例子是OK。但是,如果某些元組具有相同的值,則有必要編寫一個附加子查詢(例如,從表2中選擇max(ID))以確定適當的行。

P.S.最好不要爲您自己的表或列使用任何關鍵字(例如INDEX,DATA ...)。

How To Handle Table Column Named With Reserved Sql Keyword?

Got an Oracle Table Named as Reserved Word, Which problems may arise?