2015-02-09 5 views
0

У меня есть эта таблица (скажем, table1):Oracle SQL: GROUP BY и HAVING условие

ID1 | ID2 | NAME 

где (ID1, ID2) является составной PK.

И это еще одна таблица (скажем, TABLE2):

ID | COD1 | COD2 | DATA | INDEX 

где ID это на ПК.

мне нужно присоединиться к этой таблице на ((TABLE1.ID1 = TABLE2.COD1) AND (TABLE1.ID2 = TABLE2.COD2))

Моей проблемы заключается в том, что для каждого идентификатора TABLE2, у меня есть много кортежей с различным INDEX. Я хочу только присоединиться к кортежу, что его INDEX является MAX его группы (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

ответ

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. Но если некоторые кортежи имеют одинаковое значение, необходимо написать дополнительный подзапрос (например, выберите max (ID) из таблицы2), чтобы определить соответствующие строки.

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?