我创建了一个子查询如下
select hospital.hospitalcode, name, wardno, annualbudget
from hospital, ward
where hospital.hospitalcode = ward.hospitalcode
我要回答的问题是:考虑到所有医院病房,哪个医院的病房年度预算最低?您应该显示医院代码及其名称、病房编号及其年度预算。
我如何找到这个问题的单个条目?我意识到我需要使用 MIN 但在使用多个列名时不知道在哪里使用它
更有效的方法通常是使用分析函数
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
首先,您应该更改查询以使用正确的显式连接,即使只是为了清楚起见。对于您的具体问题,这是一种方法:
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)
首先,您想使用正确的连接语法编写查询:
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 功能。