2013-07-16 54 views
0

我希望为医院显示hospitalid,hosp name and hosp type,这些医院与医生有关联度最高。SQL加入澄清

我有两个表:

医生:doctorid, hospitalid

医院:hospitalid, hname, htype

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 
HAVING MAX(count(d.doctorid)); 

我尝试了上面的代码,但我得到一个错误 “组func被嵌套太深”。我应该如何修改d代码?

+1

这是mysql吗? SQLite的? – mnagel

+0

如果医生可以在多家医院工作,那么如果您还将医生信息保存在医生列表中,此表格布局可能会导致还原剂数据。 – ObieMD5

+0

请不要发送垃圾邮件stackoverflow。你可以更新你[上一个问题](http://stackoverflow.com/questions/17677679/sql-query-clarification)并在那里问。 Stackoverflow是针对问题的,而不是完整的代码请求。所以调整你以前的问题,人们会回答。 – Tikkes

回答

3

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

作为一个说明,也有其他的数据库更容易机制。

+0

如果存在多个具有最高值的行,该怎么办?我如何在这种情况下隔离这些行? – RDPD

+0

@Dixon,这是一个我们无法回答的业务需求问题。如果有多行,您的业务需要确定还有哪些决定因素。 – HLGEM

+0

@HLGEM我道歉,如果我听起来有点天真,但我的最终目的是检索最大值的行和上面的代码wouldnt取我,如果我有两个或更多行具有相同的最大值对吗? – RDPD

0

这就是我如何为SQL Server编写它。根据您使用的数据库后端,具体细节可能会有所不同。

SELECT TOP 1 a.hospitalid,a.hname,a.htype 
FROM 
(SELECT d.hospitalid,h.hname,h.htype, count(d.doctorid) as doctorcount FROM doctor d INNER JOIN hospital h ON d.hospitalid = h.hospitalid 
GROUP BY d.hospitalid,h.hname,h.htype) a 
ORDER BY doctorcount DESC; 
+0

HLGEM如果我不想显示doctorcount列,该怎么办? – RDPD

+0

对不起。知道了谢谢。:) – RDPD

+0

我收到此错误报告: SQL错误:ORA-00923:FROM关键字找不到预期的地方 00923. 00000 - “找不到预期的FROM关键字” – RDPD