这是学习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