這是學習SQL時常見的錯誤,認爲having Max(col)
說「只保留最大的行」。它只是意味着having <some function on the column>
沒有任何條件。例如,你可以說having count(d.doctorid) = 1
讓醫院只有一名醫生。
執行此操作的方法是對列進行排序然後取第一行。但是,「取第一行」的語法因數據庫而異。在許多SQL方言了以下工作:
SELECT d.hospitalid,h.hname,h.htype
FROM doctor d INNER JOIN
hospital h
ON d.hospitalid = h.hospitalid
GROUP BY d.hospitalid,h.hname,h.htype
order by count(d.doctorid) desc
limit 1;
在SQL Server和Sybase,語法是:
SELECT top 1 d.hospitalid,h.hname,h.htype
FROM doctor d INNER JOIN
hospital h
ON d.hospitalid = h.hospitalid
GROUP BY d.hospitalid,h.hname,h.htype
order by count(d.doctorid) desc;
在Oracle:
select t.*
from (SELECT d.hospitalid,h.hname,h.htype
FROM doctor d INNER JOIN
hospital h
ON d.hospitalid = h.hospitalid
GROUP BY d.hospitalid,h.hname,h.htype
order by count(d.doctorid) desc
) t
where rownum = 1;
EDIT(基於評論):
要獲取最大的所有行,可以執行類似於原始查詢的操作。這只是更復雜。你可以計算出使用子查詢的最大數量,並做having
子句中的比較:
SELECT d.hospitalid, h.hname, h.htype
FROM doctor d INNER JOIN
hospital h
ON d.hospitalid = h.hospitalid join
GROUP BY d.hospitalid,h.hname,h.htype
having count(d.doctorid) = (select max(NumDoctors)
from (select hospitalid, count(*) as NumDoctors
from hospitalId
group by hospitalid
) hd
)
作爲一個說明,也有其他的數據庫更容易機制。
這是mysql嗎? SQLite的? – mnagel
如果醫生可以在多家醫院工作,那麼如果您還將醫生信息保存在醫生列表中,此表格佈局可能會導致還原劑數據。 – ObieMD5
請不要發送垃圾郵件stackoverflow。你可以更新你[上一個問題](http://stackoverflow.com/questions/17677679/sql-query-clarification)並在那裏問。 Stackoverflow是針對問題的,而不是完整的代碼請求。所以調整你以前的問題,人們會回答。 – Tikkes