Một cách để làm điều này là lồng truy vấn của bạn và sau đó chọn hàng đầu tiên trong đầu ra:
select C_SE_ID, cnt
from (select CS.C_SE_ID, count(*) as cnt
from COURSE_SECTION CS join
ENROLLMENT E
on CS.C_SE_ID=E.C_SE_ID join
LOCATION L
on CS.LOC_ID=L.LOC_ID
where L.BLDG_CODE='DBW'
GROUP BY CS.C_SE_ID
order by count(*) desc
) t
where rownum = 1
Lưu ý rằng tôi đã cập nhật cú pháp tham gia lên phiên bản hiện đại hơn bằng cách sử dụng on
thay vì where
.
Nếu bạn muốn tất cả giá trị tối thiểu (và có nhiều hơn một), sau đó tôi sẽ sử dụng các hàm phân tích. Đó là một ý tưởng rất giống với truy vấn ban đầu của bạn:
select *
from (select CS.C_SE_ID, count(*) as cnt,
max(count(*)) over (partition by cs.c_se_id) as maxcnt
from COURSE_SECTION CS join
ENROLLMENT E
on CS.C_SE_ID=E.C_SE_ID join
LOCATION L
on CS.LOC_ID=L.LOC_ID
where L.BLDG_CODE='DBW'
GROUP BY CS.C_SE_ID
order by count(*) desc
) t
where cnt = maxcnt;
Hãy thử điều này thay vì truy vấn ban đầu của bạn:
SELECT E.S_ID
FROM ENROLLMENT E
where E.C_SE_ID in (select C_SE_ID
from (select CS.C_SE_ID, count(*) as cnt,
max(count(*)) over (partition by cs.c_se_id) as maxcnt
from ENROLLMENT E
LOCATION L
on CS.LOC_ID=L.LOC_ID
where L.BLDG_CODE='DBW'
GROUP BY e.C_SE_ID
) t
where cnt = maxcnt)
);
Ngoài việc sửa các phép nối, tôi cũng đã xóa tất cả các tham chiếu đến course_section
. Bảng này dường như không được sử dụng (trừ khi để lọc kết quả) và việc xóa nó đi sẽ đồng nghĩa với các truy vấn.