SQL子查询 - 如何查找最小值

时间:2012-07-11 18:24:41

标签: sql oracle min

我创建了一个子查询,如下所示

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

我想回答的问题是:考虑到所有医院病房,哪家医院的病房年度预算最低?您应该显示医院代码及其名称,病房号码和年度预算。

我如何找到这个问题的单个条目?我意识到我需要使用MIN,但在使用多个列名时不知道在哪里使用它

3 个答案:

答案 0 :(得分: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来任意打破平局。

答案 1 :(得分:2)

首先,您希望使用正确的连接语法编写查询:

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

其次,你实际上不需要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 :(得分: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)