2013-04-24 8 views
9

Jestem nowy w świecie Oracle i SQL. Mam drobny problem z zapytaniem, którego nie mogę wymyślić dla mnie, spędziłem kilka godzin próbując różnych podejść i nie mogę uzyskać oczekiwanego rezultatu. Oto moje zapytanie:Jak używać funkcji MAX() w wyniku podzapytania?

SELECT * 
from(Select membership.mem_desc,membership.mem_max_rentals,membership_history.mem_type,  
    count(membership_history.MEM_TYPE) as membership_count 
    from membership_history 
    JOIN membership ON membership.mem_type = membership_history.mem_type 
    group by (membership_history.mem_type,membership.mem_desc,membership.mem_max_rentals) 
    ) g 
WHERE g.membership_count = (select MAX(membership_count) from g); 

Wewnętrzna kwerenda działa idealnie i zwraca dwa wyniki. Teraz, gdy mam te dwie wartości, próbuję znaleźć sposób na zwrócenie wiersza z maksymalną wartością membership_count, w której ciągle utknę. W powyższym zapytaniu próbowałem użyć klauzuli MAX() w klauzuli where, ale w tym zaznaczeniu ciągle pojawia się błąd "table not found" (co oznacza "g"). Moje pytanie brzmi: jak używać funkcji MAX() w wynikach mojego podkwerendy? Wszelkie przemyślenia lub sugestie byłyby bardzo mile widziane !!!!!

+0

Jeśli nie jesteś tego świadomy, [sqlfiddle] (http://www.sqlfiddle.com) ma dostępną bazę danych Oracle i możesz grać na różnych formatach instrukcji. – hd1

Odpowiedz

0

Można spróbować czegoś podobnego

SELECT membership.mem_desc,membership.mem_max_rentals,membership_history.mem_type, membership_count, rank() over ORDER BY membership_count DESC as ranky 
from 
(Select membership.mem_desc,membership.mem_max_rentals,membership_history.mem_type,  
count(membership_history.MEM_TYPE) as membership_count 
from membership_history 
JOIN membership ON membership.mem_type = membership_history.mem_type 
group by (membership_history.mem_type,membership.mem_desc,membership.mem_max_rentals) 
) 
WHERE ranky =1; 
10

Nie trzeba podkwerendę że znajdzie maksymalną wartość.
Zamiast tego; po prostu trzeba się pierwszy wiersz po zamówione wiersze:

select * from (
    select 
    membership.mem_desc, 
    membership.mem_max_rentals, 
    membership_history.mem_type,  
    count(membership_history.MEM_TYPE) as membership_count 
    from membership_history 
    JOIN membership ON membership.mem_type = membership_history.mem_type 
    group by (membership_history.mem_type,membership.mem_desc,membership.mem_max_rentals) 
    ORDER BY 4 DESC -- Added this line 
) g 
WHERE ROWNUM = 1. -- Added this line 
0

Nie można użyć tabeli pochodzącą bezpośrednio w klauzuli WHERE da table or view does not exist błąd tak, aby uzyskać maksymalną wartość licznika można użyć HAVING klauzula lub Analytical Functions lub Rownum jak

select * from 
     (Select membership.mem_desc,membership.mem_max_rentals,membership_history.mem_type,  
     count(membership_history.MEM_TYPE) as membership_count 
     from membership_history a 
     JOIN membership b ON b.mem_type = a.mem_type 
     group by (membership_history.mem_type,membership.mem_desc,membership.mem_max_rentals) 
     having count(a.MEM_TYPE) = (Select  
     MAX(count(a.MEM_TYPE)) from membership_history a 
     JOIN membership b ON b.mem_type = a.mem_type 
     group by (a.mem_type,b.mem_desc,b.mem_max_rentals))); 

(OR)

select * from 
(SELECT g.*,rank() over (order by membership_count desc) rnk from 
     (Select membership.mem_desc,membership.mem_max_rentals,membership_history.mem_type,  
     count(membership_history.MEM_TYPE) as membership_count 
     from membership_history 
     JOIN membership ON membership.mem_type = membership_history.mem_type 
     group by (membership_history.mem_type,membership.mem_desc,membership.mem_max_rentals)) g) 
WHERE rnk=1; 

(OR)

select * from 
(SELECT g.*,rownum rn from 
     (Select membership.mem_desc,membership.mem_max_rentals,membership_history.mem_type,  
     count(membership_history.MEM_TYPE) as membership_count 
     from membership_history 
     JOIN membership ON membership.mem_type = membership_history.mem_type 
     group by (membership_history.mem_type,membership.mem_desc,membership.mem_max_rentals) 
     order by membership_count desc) g) 
WHERE rn=1; 
3

to dobre SQL.

Najlepszym sposobem, aby znaleźć wartość kolumny przy użyciu klucza podstawowego max wartość kolumny wynosi:

SELECT .... from tablename 
WHERE ... AND 
    (SELECT max(primary key name) FROM tablename WHERE ....) = primary_key_name 

ten przykład zwróci wartość skalarną.

0

Myślę, że najczystszym rozwiązaniem jest użycie warunku porównania ALL. Służy do porównywania wartości z listą lub podzapytaniem.

SELECT 
    m.mem_desc, 
    m.mem_max_rentals, 
    mh.mem_type,  
    COUNT(mh.mem_type) as membership_count 
FROM membership_history mh 
JOIN membership m ON m.mem_type = mh.mem_type 
GROUP BY mh.mem_type,m.mem_desc,m.mem_max_rentals 
HAVING membership_count >= ALL (
    SELECT count(*) 
    FROM membership_history 
    GROUP BY mem_type 
) 
Powiązane problemy