2013-04-24 33 views
9

Tôi mới sử dụng Oracle và thế giới SQL. Tôi có một vấn đề nhỏ với một truy vấn mà tôi không thể tìm ra cho cuộc sống của tôi, tôi đã dành một vài giờ cố gắng phương pháp tiếp cận khác nhau và tôi không thể có được kết quả tôi mong đợi. Vì vậy, heres truy vấn của tôi:Cách sử dụng MAX() trên kết quả truy vấn con?

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

Vì vậy, truy vấn bên trong hoạt động hoàn hảo và trả về hai kết quả. Bây giờ tôi có hai giá trị này, tôi đang cố gắng tìm ra cách trả về hàng với giá trị tối đa là membership_count, là nơi tôi tiếp tục gặp khó khăn. Trong truy vấn trên tôi đã thử sử dụng MAX() trong mệnh đề where nhưng bên trong mà chọn tôi tiếp tục nhận được lỗi 'table not found' (có nghĩa là 'g'). Vì vậy, câu hỏi của tôi là làm thế nào để tôi sử dụng hàm MAX() trên các kết quả của truy vấn phụ của tôi? Bất kỳ suy nghĩ hay lời đề nghị sẽ được đánh giá cao!!!!!

+0

Nếu bạn không biết về nó, [sqlfiddle] (http://www.sqlfiddle.com) không có sẵn Oracle và bạn có thể phát với các định dạng báo cáo khác nhau. – hd1

Trả lời

0

Bạn có thể thử một cái gì đó giống như

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

Bạn không cần subquery đó tìm giá trị lớn nhất.
Thay vào đó,; bạn chỉ cần hàng đầu tiên sau khi ra lệnh các hàng:

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

Bạn có thể không sử dụng một bảng có nguồn gốc trực tiếp trong mệnh đề where nó sẽ cho table or view does not exist lỗi như vậy để có được giá trị đếm tối đa bạn có thể sử dụng HAVING khoản hoặc Analytical Functions hoặc Rownum như

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)

.210

(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

Đây là tất cả các SQL tốt.

Cách tốt nhất để tìm một giá trị cột bằng cách sử dụng giá trị cột khóa chính tối đa là:

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

ví dụ này sẽ trả về một giá trị vô hướng.

0

Tôi nghĩ giải pháp sạch nhất là sử dụng điều kiện So sánh TẤT CẢ. Nó được sử dụng để so sánh một giá trị với một danh sách hoặc truy vấn phụ.

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 
)