2012-05-01 40 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 

你看,它仍然是斷裂成塊,一個由保險公司來獲得othopedists的數量和一個得到骨科的數量由保險公司和該人員進行訪問的人員。我進一步做了'SELECT DISTINCT v.pid,v.did FROM Visits',因爲我不希望醫生的數量不正確,因爲我不止一次地訪問了同一個人。

+0

以及我目前正在閱讀這本書:http://pages.cs.wisc.edu/~dbbook/ Tho我幾乎沒有從中學到很多,你有沒有更好的書或SQL指南? –

1

這實際上取決於數據庫。某些數據庫(例如MySQL)在優化使用視圖的查詢時非常糟糕。其他人並不那麼糟糕。

但是,將查詢分解成多個碎片然後將這些查詢合併爲更復雜的查詢的策略是很好的。我會(通常)最終做出一個結合這些部分的大型查詢。

+0

在某些情況下,它幾乎是不可能的......至少從我看到它的方式困難,然後我的方法......有任何提示? –

+0

@Ofek - 不是不可能的,但肯定更難,而且你只需要更好的經驗:) –