SQL查询帮助,条件连接

时间:2010-09-06 23:06:40

标签: sql sql-server database relational-database

SQL新手在这里:)

如果有人有兴趣,这是我的表格。

AHH,无法发布图片 http://img832.imageshack.us/img832/442/72098588.jpg

我要做的是在日期间隔内查询tblPatientStats表(@StartDate,@ EndDate) 并在winforms的数据网格中对它们进行相应的分组。

因此,tblPatientStats中的每一行都有一个RefDoctor或RefMode,或两者都有,或者根本没有。

因此,查询应返回一个表格,其中包含来自tblPatient的患者姓名,来自tblRefMode的RefMode,RefDoctor的名称(Title + FirstName + lastName)以及来自tblPatientStats的SessionDate

==> 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。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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