2016-09-11 10 views
0

다음과 같은 쿼리가 있습니다. 그것은 대부분의 시간을 작동하지만, 때때로 실패하고 나는 그 이유를 지적 할 수 없습니다. 나는 그것이 일주일에 한 번 일어난 것처럼 실패의 원인이되는 선을 좁혔지만, 제 동료는 여러 번보고했습니다. 더 좋은 방법이 있습니까?SQL이 NULL입니다. 결과가 깨졌습니다.

내가 SQL을 실패하게 만드는 라인은 (LessonSubject.StartDate<=? OR LessonSubject.StartDate IS NULL)이지만, 특별히 LessonSubject.StartDate IS NULL 명령은 LessonSubject.StartDate<=?으로 일부 데이터를 반환합니다. 내 쿼리를 해부하면서, 나는 (LessonSubject.EndDate>=? OR LessonSubject.EndDate IS NULL)을 제거했지만 일단이 행을 추가하면 동일한 동작을하고 내 코드가 깨질 것입니다.

lessonSubject.StartDate이 비어 있거나 내 매개 변수 ?lessonsubject.startdate보다 작은 경우 데이터를 검색하려고합니다.

도움을 주시면 감사하겠습니다. 내가 대부분의 시간 동안 일한다고 말했던 것처럼, 때때로 실패하고 나는 그 이유를 지적 할 수는 없지만, 그것이 실패하는 것은 startdate IS NULL 상태라고 생각합니다. (여기 Left Outer Join) Outer Join's

SELECT PeriodList.pk_PeriodListID, CASE PeriodList.DayShort 
    WHEN 'M' THEN '" & $mon & "' 
    WHEN 'Tu' THEN '" & $tues & "' 
    WHEN 'W' THEN '" & $wed & "' 
    WHEN 'Th' THEN '" & $thurs & "' 
    WHEN 'F' THEN '" & $fri & "' 
    WHEN 'S' THEN '" & $sat & "' 
    ELSE '" & $sun & "' 
    END AS mydate, PeriodList.PeriodNumber, PeriodInformation.StartTime, PeriodInformation.EndTime, SubjectList.SubjectCode , RoomList.RoomCode, Staff.StaffID, Lesson.pk_LessonID, SetList.SetNumber, SetList.SetName, SetList.Form 

FROM PeriodList 

LEFT JOIN PeriodInformation 
ON PeriodList.pk_PeriodListID = PeriodInformation.fk_PeriodListID 

LEFT JOIN Lesson 
ON Lesson.fk_PeriodListID = PeriodInformation.fk_PeriodListID 

LEFT JOIN LessonRoom 
ON Lesson.pk_LessonID = LessonRoom.fk_LessonID 

LEFT JOIN RoomList 
ON LessonRoom.fk_RoomID = RoomList.pk_RoomID 

LEFT JOIN LessonStaff 
ON Lesson.pk_LessonID = LessonStaff.fk_LessonID 

LEFT JOIN Staff 
ON LessonStaff.fk_StaffID = Staff.pk_StaffID 

LEFT JOIN LessonSubject 
ON Lesson.fk_LessonSubjectID = LessonSubject.pk_LessonSubjectID 

LEFT JOIN SubjectList 
ON LessonSubject.fk_SubjectListID = SubjectList.pk_SubjectListID 

LEFT JOIN SetList 
ON SetList.pk_SetListID = LessonSubject.fk_SetListID 

LEFT JOIN SetMember 
ON SetMember.fk_SetListID = SetList.pk_SetListID 

WHERE PeriodInformation.Rotation=? AND 
PeriodList.VersionCode=? AND 
(LessonSubject.StartDate<=? OR LessonSubject.StartDate IS NULL) AND 
(LessonSubject.EndDate>=? OR LessonSubject.EndDate IS NULL) AND 
Setlist.fk_AcademicYearID=? 

답변

0

엄지 손가락의 규칙

당신이 필터 (PeriodInformation.Rotation, Setlist.fk_AcademicYearID)에 대한 권리 테이블의 모든 레코드는 다음 ON 상태로 필터를 이동해야합니다

. 당신이 비교

FROM periodlist 
     LEFT JOIN periodinformation 
       ON periodlist.pk_periodlistid = periodinformation.fk_periodlistid 
       AND periodinformation.rotation = ? 
     LEFT JOIN lesson 
       ON lesson.fk_periodlistid = periodinformation.fk_periodlistid 
     LEFT JOIN lessonroom 
       ON lesson.pk_lessonid = lessonroom.fk_lessonid 
     LEFT JOIN roomlist 
       ON lessonroom.fk_roomid = roomlist.pk_roomid 
     LEFT JOIN lessonstaff 
       ON lesson.pk_lessonid = lessonstaff.fk_lessonid 
     LEFT JOIN staff 
       ON lessonstaff.fk_staffid = staff.pk_staffid 
     LEFT JOIN lessonsubject 
       ON lesson.fk_lessonsubjectid = lessonsubject.pk_lessonsubjectid 
       AND lessonsubject.startdate <=? 
       AND lessonsubject.enddate >=? LEFT 
     JOIN subjectlist 
     ON lessonsubject.fk_subjectlistid = subjectlist.pk_subjectlistid 
     LEFT JOIN setlist 
       ON setlist.pk_setlistid = lessonsubject.fk_setlistid 
       AND setlist.fk_academicyearid = ? 
     LEFT JOIN setmember 
       ON setmember.fk_setlistid = setlist.pk_setlistid 
WHERE periodlist.versioncode = ? 
+0

동안 NULL 값 (비 일치하는 레코드가) 거부 얻을 것이다 Where 절의 오른쪽 테이블 필터를 넣을 때 나는 당신이 필터에 제대로 대부분의 시간 때문에 올바른 위치를 엄지 손가락의 규칙을 인용 의심 오른쪽 테이블의 경우'where' 절이 있지만 OP의 경우'where' 절은 특별히 LessonSubject의 null 값을 허용합니다. – GSerg

+0

@GSerg -하지만이 두 열에는 해당되지 않습니다. PeriodInformation.Rotation, Setlist.fk_AcademicYearID' –

+0

아니요,하지만 이것이 OP가 의미하는 바를 심각하게 의심합니다. 왼쪽 결합 된 열이 조건을 만족하지 않는 경우 ('null'이 될지라도) 귀하의 코드는'periodlist.versioncode =? '가있는 모든 레코드를 제공합니다. * 때로는 * 정확하게 당신이 원하는 것이지만 * 대부분의 경우 * 그렇지 않습니다. 대부분의 경우 왼쪽으로 조인 된 열을 필터링하고 값이 일치하지 않는 행을 제거하려고합니다. – GSerg

관련 문제