【问题标题】:SQL Sub-Query - how to find a min valueSQL 子查询 - 如何找到最小值
【发布时间】:2012-07-11 10:40:21
【问题描述】:

我创建了如下子查询

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

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

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

【问题讨论】:

  • 你能把你的桌子设计好吗?
  • 子查询的修订,我不知道如何在我的代码中实现 MIN 函数

标签: sql oracle min


【解决方案1】:

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

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任意打破平局。

【讨论】:

    【解决方案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)
    

    【讨论】:

      【解决方案3】:

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

      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 功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-25
        • 2022-10-26
        • 2013-04-27
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多