2013-04-24 10 views
9

私は、OracleとSQLの世界で初めてです。私は私の人生のために私が把握することができないクエリでわずかな問題を抱えて、私は別のアプローチを試して数時間を費やし、私は期待した結果を得ることができません。だから私のクエリ:MAX()をサブクエリーの結果に使用する方法は?

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); 

したがって、内側のクエリは完全に動作し、2つの結果を返します。これで2つの値が得られましたので、member_countの最大値を持つ行を返す方法を理解しようとしています。上記のクエリでは、MAX()をwhere節で試してみましたが、その中では、 'テーブルが見つかりません'( 'g'の意味)というエラーが発生しています。だから私の質問は私のサブクエリの結果にMAX()関数を使用する方法です?どんな考えや提案も大変ありがとうございます!!!!!

+0

[sqlfiddle](http://www.sqlfiddle.com)にはOracleが用意されており、さまざまな形式の文で再生できます。 – hd1

答えて

0

あなたはあなたが最大値を見つけ、サブクエリを必要としない

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

ような何かを試みることができます。
代わりに、;それはあなたがHAVINGを使用することができ、最大カウント値を取得するためにtable or view does not existエラー を与える

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

あなたは、where句で直接派生テーブルを使用することはできません:あなただけ注文列を有する後最初の行を必要とします

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)

のような句や Analytical Functionsまたは

(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

これは、すべての良いSQLです。

最大主キー列の値を使用した列の値を見つけるための最善の方法は次のとおりです。

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

この例では、スカラー値を返します。

0

最もクリーンな解決策は、すべての比較条件を使用することだと思います。値をリストまたはサブクエリと比較するために使用されます。

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 
) 
関連する問題