2012-05-01 15 views
1

私はこの学期のDBMSコースを受けて、私は良い進歩を遂げ、良い考え方を実践していることを確かめたいです。私自身のアプローチでは、クエリを扱うのがちょっと分かりやすくなります。私はサブクエリにクエリを分割し、 、それらのビューを使用して、私が必要とする情報を単に収集することは一般的には良いアプローチですか?SQLクエリ、複雑なクエリを処理するには?

代替手段は何ですか?

あなた自身のアプローチは何ですか?それが私のほうが良いと思うなら、なぜですか?

例:

は、与えられた:DB:http://sqlfiddle.com/#!2/cdd98/1

(Q7)自分の保険会社に関連するすべての整形外科医(専門)を訪れた患者を検索します。

CREATE VIEW Orthos AS 
SELECT d.cid,d.did 
FROM Doctors d 
WHERE d.speciality='Orthopedist'; 

CREATE VIEW OrthosPerInc AS 
SELECT o.cid, COUNT(o.did) as countd4i 
FROM Orthos o 
GROUP BY o.cid; 

CREATE VIEW OrthoVisitsPerPat AS 
SELECT v.pid,COUNT(o.did) as countv4d 
FROM Orthos o,Visits v,Doctors d 
WHERE o.did=v.did and d.did=o.did 
GROUP BY v.pid,d.cid; 

SELECT p.pname,p.pid,p.cid 
FROM OrthoVisitsPerPat v, OrthosPerInc i,Patient p 
WHERE i.countd4i = v.countv4d and p.pid=v.pid and p.cid=i.cid 
+0

なぜ閉じる? –

+2

あなたは学校に通っているので、現代の結合構文 –

+0

@ KMを学ぶべきでしょう。おそらくあなたはどのようにその出来事の例を教えてくれますか? –

答えて

1

派生テーブル、一時テーブル、またはCTESを使用してビューを使用しないでください。ビューはデータベース内の永続的なオブジェクトであり、特に、他のビューを呼び出すビューを作成し始めると、それらの過剰使用は実際の問題です。ビューが間違っていると誤解されていた開発者がシステムを非常に遅くしてしまったため、データがロードされてから使用できなくなったため、私たちはほとんど何百万ドルのクライアントを失った。初心者は決してビューを書く必要はありません。

実際の結合を使用する方法を学んでください。

しかし、はい、複雑なものを塊に分割するのは問題ありません。ビューを使用しないでください。

暗黙的な結合は非常に悪い手法であり、20年以上経過しており、2012年に使用する必要はありません。貧しい技術を学んではいけません、正しいものを学んでください。

私は(テストしていません)のようなものをやっているだろう:

SELECT MDByPatient.pname,MDByPatient.pid,MDByPatient.cid 
FROM 
    (
    SELECT p.pname,p.pid,p.cid, count(v.did) as CountMDByPatient 
    FROM Patient p 
    INNER JOIN (SELECT DISTINCT v.pid, v.did FROM Visits) v 
     ON p.pid = v.pid 
    INNER JOIN Doctors d 
     ON d.did = v.did and p.cid = d.cid 
    WHERE d.speciality='Orthopedist' 
    GROUP BY p.pname,p.pid,p.cid 
    ) MDByPatient 
INNER JOIN 
    (
    SELECT cid, count(did)as CountMDByIns 
    FROM Doctors 
    WHERE d.speciality='Orthopedist' 
    GROUP BY cid 
    ) MDByInsurance 
     ON MDByPatient.cid = MDByInsurance.cid 
where MDByPatient.CountMDByPatient = MDByInsurance.CountMDByIns 

あなたはそれがまだチャンクに分割された参照、1は、整形外科医の数を取得するために保険会社と一つでothopedistsの数を取得します保険会社とその人が訪問した人物。私はさらに、「DISTINCT v.pid、v.did FROM Visitsを選択してください。」と言っています。なぜなら、私は同じ人を2回以上訪問したため、医師の数が正しくないことを望まないからです。

+0

私は現在、この本を読んでいます:http://pages.cs.wisc.edu/~dbbook/ Tho私はほとんどそれから多くを学ぶことができます、あなたはより良い本やSQLのためのガイドを持っていますか? –

1

これは実際にデータベースによって異なります。いくつかのデータベース(例えばMySQLのような)は、ビューを使用するクエリを最適化するのはひどいです。他はそれほど悪くないです。

しかし、クエリを分割してより複雑なクエリにまとめるという戦略は良い方法です。私はちょうど(一般的に)パートを組み合わせた1つの大きなクエリを作成することになります。

+0

いくつかのケースでは、それはほとんど不可能です...少なくとも私はそれを参照してくださいどこからハード私のアプローチは...任意のヒントを得た? –

+0

@Ofek - 不可能ではありませんが、確かに難しく、あなたはちょうど経験でより良くなるでしょう:) –