Справка по SQL-запросу, условное соединение - PullRequest
1 голос
/ 07 сентября 2010

SQL новичок здесь:)

Вот мои таблицы, если кому-то интересно.

AHH, пока не могу опубликовать изображение http://img832.imageshack.us/img832/442/72098588.jpg

Я пытаюсь сделать запрос к таблице tblPatientStats за определенный промежуток времени (@StartDate, @EndDate) и сгруппируйте их соответственно в сетке данных по winforms.

Таким образом, каждая строка в tblPatientStats имеет либо RefDoctor, либо RefMode, либо оба, либо их вообще нет.

Таким образом, запрос должен возвращать таблицу с именем пациента из tblPatient, RefMode из tblRefMode, именем RefDoctor (Title + FirstName + 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 

Что я делаю не так? Время запроса истекает каждый раз, таблицы маленькие, менее 10 тыс. Записей в каждой.

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 07 сентября 2010

Я подозреваю, что проблема связана с декартовым соединением

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 
...