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 に答える