2013-07-16 57 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