2012-07-11 67 views
1

我創建了一個子查詢如下SQL子查詢 - 如何找到一個最小值

select hospital.hospitalcode, name, wardno, annualbudget 
from hospital, ward 
where hospital.hospitalcode = ward.hospitalcode 

我想回答的問題是這樣的:把所有醫院病房的帳戶,哪家醫院有病房年度預算最低?您應該顯示醫院代碼及其名稱,病房號碼和年度預算。

我該如何找到這個問題的單個條目?我知道我需要使用MIN,但不知道在哪裏使用多列名

+2

看起來像作業。 – Flimzy 2012-07-11 18:26:56

+0

你可以把你的桌子設計? – 2012-07-11 18:28:42

+0

對子查詢的修訂,我不知道如何將MIN函數實現到我的代碼中,雖然 – 2012-07-11 18:29:19

回答

5

的更有效的方法通常是使用分析功能

SELECT hospitalcode, 
     name, 
     ward, 
     annualbudget 
    FROM (SELECT h.hospitalcode, 
       h.name, 
       w.wardno, 
       w.annualbudget, 
       rank() over (order by w.annualbudget asc) rnk 
      FROM hospital h 
       JOIN ward w 
       ON (h.hospitalcode = w.hospitalcode)) 
WHERE rnk = 1 

還可以,不過,使用子查詢

SELECT h.hospitalcode, 
     h.name, 
     w.wardno, 
     w.annualbudget 
    FROM hospital h 
     JOIN ward w 
     ON (h.hospitalcode = w.hospitalcode) 
WHERE w.annualbudget = (SELECT MIN(annualbudget) 
          FROM ward) 

這兩種方法都會如果有多個病房返回多行與最低預算並列。使用分析函數法,如果您想每次只返回1行,則可以使用row_number函數而不是rank來任意中斷連接。

+0

+1對於整體更完整的答案 – Lamak 2012-07-11 18:39:16

2

首先,當你想用正確的連接語法編寫查詢中使用這樣的:

select hospital.hospitalcode, name, wardno, annualbudget 
from hospital join 
    ward 
    on hospital.hospitalcode = ward.hospitalcode 

其次,你居然不要」 t需要min功能。您可以使用row_number():

select hospitalcode, name, wardno, annualbudget 
from (select hospital.hospitalcode, name, wardno, annualbudget, 
      row_number() over (order by annualbudget) as seqnum 
     from hospital join 
      ward 
      on hospital.hospitalcode = ward.hospitalcode 
    ) t 
where seqnum = 1 

這會按年度預算的順序分配一個連續的數字。所以最小的那個的值爲1.

您也可以通過訂購年度預算,並只取第一行。不過,我喜歡這個方法,因爲它是對windows函數的一個很好的介紹。

2

首先,您應該更改查詢以使用正確的顯式連接,即使它只是爲了清晰起見。對於您的具體問題,這是一種方式來做到這一點:

SELECT H.hospitalcode, H.name, W.wardno, W.annualbudget 
FROM Hospital H 
INNER JOIN Ward W 
ON H.hospitalcode = W.hospitalcode 
WHERE W.annualbudget = (SELECT MIN(annualbudget) FROM Ward)