2012-07-11 71 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)