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。
非常感谢任何帮助。
答案 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)
这几乎肯定不是理想的语义,可能会带回太多行。
我已将tblPatientStats
和tblPatient
之间的联接条件移到了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