-4

問題: 関連する医師の数が最も多い病院の Hospitalid、hname、htype を表示します。

patientテーブル:

patientid
pname
address
amount
ptype

hospitalテーブル_

hospitalid
hname
htype

doctorテーブル:

doctorid
dname
specialization
hospitalid
status

billingテーブル:

billingid
patientid
doctorid
fees
billdate

これまでのところ、これは私が持っているものです:

select * from hospital where hospitalid =
  (select hospitalid from doctor group by hospitalid having count ( doctorid ) =
      (select max ( doctoramt ) from
          (select count (doctorid) as doctoramt from doctor group by hospitalid) as tbltemp));
4

3 に答える 3

0

AS tbltempOracle でテーブルの別名を使用することはできません。このASキーワードは、テーブルではなく列のエイリアスにのみ使用できます。キーワードを削除するASか、この場合はエイリアスを参照していないため、AS tbltemp部分全体を削除できます。ここに SQL Fiddle があります

AS パーサーは最初にエイリアス名として解釈しようとしたように見えますが、それが何tbltempを意味するのかわかりません。

とにかくZZaのアプローチの方が優れていますが、分析関数を使用して、テーブルに複数回ヒットすることを避けることもできます。

select hospitalid, hname, htype from (
  select hospitalid, hname, htype, doc_count,
    rank() over (order by doc_count desc) as rn
  from (
    select h.hospitalid, h.hname, h.htype,
        count(d.doctorid) as doc_count
    from hospital h
    join doctor d on d.hospitalid = h.hospitalid
    group by h.hospitalid, h.hname, h.htype
  )
)
where rn = 1;

別のSQL Fiddle here。最も内側selectのレベルでカウントを行い、次のレベルでグループ化された結果を各病院の医師数の多い順にランク付けし、最も外側のレベルでそれを最高ランクに制限します。

いずれにせよ、同数の病院 (医師の数が同じ 2 つの病院) がある場合は、複数の行が返されます。それがあなたの望むものでないなら、どうやって引き分けにするかを決める必要があります。

于 2013-05-16T07:03:49.823 に答える
0

これを試して:

SELECT h.hospitalid, h.hname, h.htype 
FROM hospital h, doctor d
WHERE h.hospitalid = d.hospitalid
GROUP BY h.hospitalid, h.hname, h.htype 
HAVING COUNT(*) = (SELECT MAX(a) from (SELECT COUNT(*) a from doctor group by hospitalid));
于 2013-05-16T05:32:56.273 に答える