我创建了一个子查询,如下所示
select hospital.hospitalcode, name, wardno, annualbudget
from hospital, ward
where hospital.hospitalcode = ward.hospitalcode
我想回答的问题是:考虑到所有医院病房,哪家医院的病房年度预算最低?您应该显示医院代码及其名称,病房号码和年度预算。
我如何找到这个问题的单个条目?我意识到我需要使用MIN,但在使用多个列名时不知道在哪里使用它
答案 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)