2010-09-06 76 views
1

SQL新手在這裏:)SQL查詢幫助,條件加入

這是我的表,如果任何人有興趣。

AHH,傾斜後的圖像又 http://img832.imageshack.us/img832/442/72098588.jpg

我試圖做的是一個日期間隔(@StartDate,@EndDate)中查詢tblPatientStats表 ,並在數據網格因此將其組在winforms上。

因此,tblPatientStats中的每一行都有一個RefDoctor或RefMode,或兩者兼有或根本沒有。

所以查詢將返回一個表,從tblPatient,從tblRefMode的RefMode的RefDoctor的姓名(名稱+名字+的lastName)和SESSIONDATE從tblPatientStats

==>病人的姓名yfrog dot com/0yhi2dj

這是我迄今的嘗試。

INSERT @Final(Name, Doctor, Mode, SessionDate) 
SELECT DISTINCT (FirstNames + LastName) as Name, 
(tblRefDoctor.RefDTitle + ' ' + tblRefDoctor.RefDFNames + ' ' + tblRefDoctor.RefDName) AS Doctor, 
tblRefMode.RefMode AS Mode, SessionDate 

FROM tblPatientStats, tblPatient 
left outer join tblRefDoctor on (RefDoctor = tblRefDoctor.RefDoctor) 
left outer join tblRefMode on (RefModeID = tblRefMode.RefModeID) 
WHERE 
tblPatientStats.RefDoctor IS NOT NULL or tblPatientStats.RefModeID IS NOT NULL 
AND 
tblPatient.PatientID = tblPatientStats.PatientID 
AND tblPatientStats.SessionDate between @StartDate AND @EndDate 

我在做什麼錯?查詢每次超時,表格很小,每個記錄小於10K條記錄。

任何幫助將非常感激。

回答

2

我懷疑這個問題是因爲笛卡爾的加入對

tblPatientStats, tblPatient 

雖然存在where子句中連接條件不存在與布爾運算符的優先級的問題。這是爲了Not, And, Or所以我認爲你需要圍繞'或'編輯條件括號。

與應用,顯示有效的運算符優先級括號中的原始查詢的WHERE條件是

WHERE 
tblPatientStats.RefDoctor IS NOT NULL or 

(tblPatientStats.RefModeID IS NOT NULL 
    AND tblPatient.PatientID = tblPatientStats.PatientID 
    AND tblPatientStats.SessionDate between @StartDate AND @EndDate) 

這是幾乎可以肯定不是所需的語義,並可能會帶回太多行。

我搬到連接條件tblPatientStatstblPatient之間成的JOIN子句,並添加括號到Or編條件。

FROM tblPatientStats 
inner join tblPatient on tblPatient.PatientID = tblPatientStats.PatientID 
left outer join tblRefDoctor on RefDoctor = tblRefDoctor.RefDoctor 
left outer join tblRefMode on RefModeID = tblRefMode.RefModeID 
WHERE 
(tblPatientStats.RefDoctor IS NOT NULL or tblPatientStats.RefModeID IS NOT NULL) 
AND tblPatientStats.SessionDate between @StartDate AND @EndDate 
+0

乾杯,工作! – Rillanon 2010-09-06 23:33:12

+0

爲什麼你不應該使用隱含的語法或隱含的顯式組合的另一個原因。 – HLGEM 2010-09-07 20:31:04