2

与えられた:

InsuranceCompanies ( cid、名前、電話番号、住所)

医師(した、名前、専門、住所、電話番号、年齢、cid)

患者 ( pid、名前、住所、電話番号、年齢、性別、cid)

訪問 ( vid、 did 、 pid 、 date 、 description )

どこ

cid - 保険会社コード
did - ドクターコード
pid - 患者コード
vid - 訪問コード

および TASK : 医師ごとに、20 ~ 25 歳の (異なる) 患者の数を返します。

は :

SELECT  V.did, COUNT ( V.pid ) 
FROM    (   SELECT  DISTINCT V1.did, V1.pid
            FROM    Visits V1,Patient P
            WHERE   P.pid=V1.pid and P.age >= 20 and  P.age <=25 ) AS V 
GROUP BY    V.did

に相当 :

SELECT  V.did, COUNT (DISTINCT V.pid ) 
FROM    Visits V,Patient P
WHERE   P.pid=V.pid and P.age >= 20 and  P.age <=25
GROUP BY    V.did

そして、それらは両方ともタスクに対する良い解決策ですか?

4

5 に答える 5

3

2 番目のクエリは、タスクにより適切であり、より適切に最適化する必要があります。また、各クエリで Visit.age を参照します。pateints に参加して、patient.age を参照するべきではありませんか?

また、それぞれで、医師が行った一意の訪問をカウントしています。訪問が重複することはないため、個別のステートメントは必要ありません。代わりに、個別の患者 (p.id) をカウントする必要があります。

于 2012-04-24T20:27:33.157 に答える
1

2番目の例は私にはうまく見えます。これが計画にコンパイルされると、RDBMS は多くのアルゴリズムから最適な方法を見つけ出します。最初のバージョンで導入した中間ステップを追加する必要はないと思います。

最善のアプローチを確実に行いたい場合は、生成された計画を見て、それらを比較してください。そして、読み取り、CPU 時間などを見てください。

その方法は、使用している特定の RDBMS によって異なります。

于 2012-04-24T20:27:51.230 に答える
0

最初のクエリは機能しますが、あまり一般的ではありません。

2 番目のクエリは進むべき道であり、何が起こるかがより明確になります。

于 2012-04-24T20:26:56.323 に答える
0

これらは、おそらく 2 つの異なるクエリです。

1) 患者と医師の間の個別の訪問をカウントしています。これは、患者が医師を 2 回診察した場合、それをカウントしないことを意味します。

2) 医師による訪問をカウントしているだけです。同じ患者による複数の訪問がある場合は、2 回カウントされます。

したがって、タスクについては、1) が正解ですが、2) の方が見栄えがします

SELECT  V.did, COUNT ( V.id ) 
FROM    (   SELECT  DISTINCT V1.did, V1.pid
            FROM    Visits V1
            WHERE V1.age >= 20 and  V1.age <=25 ) AS V  
GROUP BY    V.did

次のように書く方が良いかもしれません

SELECT  V.did, COUNT ( V.pid ) ### change here
FROM    Visits, ### your joins
            WHERE V1.age >= 20 and  V1.age <=25 
GROUP BY    V.did
于 2012-04-24T20:28:04.727 に答える
0

左結合を使用するfor each doctor必要があります0

select d.did, count(distinct p.pid) from doctor d
left join visits v on d.did = v.did
join patients p on v.pid = p.pid
where p.age between 20 and 25
group by d.did
于 2012-04-24T20:38:06.013 に答える