2017-06-27 37 views
-1

表的部門名稱:要顯示在SQL最少的學生數

Department (dept_id,dept_name) 
Students(student_id,student_name,dept_id) 

我使用的是Oracle。我必須打印該部門的姓名,該部門的姓名必須至少爲no。學生的。由於我是SQL新手,所以我被困在這個問題上。到目前爲止,我已經這樣做了:

select d.department_id,d.department_name, 
from Department d 
join Student s on s.department_id=d.department_id 
where rownum between 1 and 3 
group by d.department_id,d.department_name 
order by count(s.student_id) asc; 

輸出錯誤。它來到IT,SE,CSE而輸出應該是IT,CSE,SE!我的查詢是否正確?或者在我的查詢中有什麼缺失?

我在做什麼錯?

+1

Oracle和MySQL屬於同一家公司,但是是不同的產品。你使用哪一個? – Shadow

+0

MySQL。對不起這是我的錯。將刪除Oracle標記 –

+0

rownum是2個表中的任何一個字段? – Shadow

回答

0

可能性之一:從表students在第一

select dept_id, dept_name 
    from (
    select dept_id, dept_name, 
      rank() over (order by cnt nulls first) rn 
     from department 
     left join (select dept_id, count(1) cnt 
        from students 
        group by dept_id) using (dept_id)) 
    where rn = 1 

組數據,連接表department,等級號碼,取第一行(S)。

left join用於保證我們將檢查沒有學生的部門。 rank()用於有兩個或更多部門,學生人數最少的部門。

0

要找到學生人數最少的部門,您必須對每個部門ID進行計數,然後以最少的計數獲取ID。

作爲Oracle這12c的無非是:

select department_id 
from student 
group by department_id 
order by count(*) 
fetch first row with ties 

然後你可以在設置中發現的ID選擇部門。

select * from department where id in (<above query>); 

在舊版本中,你可以使用RANK而是由數排名的部門:

select department_id, rank() over (order by count(*)) as rnk 
from student 
group by department_id 

rnk = 1的行會是具有最低計數部門的ID。所以你可以選擇部門:

select * from department where (id, 1) in (<above query>);