1

我创建了一个子查询如下

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

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

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

4

3 回答 3

6

更有效的方法通常是使用分析函数

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

于 2012-07-11T18:31:08.467 回答
3

首先,您应该更改查询以使用正确的显式连接,即使只是为了清楚起见。对于您的具体问题,这是一种方法:

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)
于 2012-07-11T18:31:33.843 回答
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 功能。

于 2012-07-11T18:30:23.497 回答