다음과 같은 쿼리가 있습니다. 그것은 대부분의 시간을 작동하지만, 때때로 실패하고 나는 그 이유를 지적 할 수 없습니다. 나는 그것이 일주일에 한 번 일어난 것처럼 실패의 원인이되는 선을 좁혔지만, 제 동료는 여러 번보고했습니다. 더 좋은 방법이 있습니까?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=?
동안
NULL
값 (비 일치하는 레코드가) 거부 얻을 것이다 Where 절의 오른쪽 테이블 필터를 넣을 때 나는 당신이 필터에 제대로 대부분의 시간 때문에 올바른 위치를 엄지 손가락의 규칙을 인용 의심 오른쪽 테이블의 경우'where' 절이 있지만 OP의 경우'where' 절은 특별히 LessonSubject의 null 값을 허용합니다. – GSerg@GSerg -하지만이 두 열에는 해당되지 않습니다. PeriodInformation.Rotation, Setlist.fk_AcademicYearID' –
아니요,하지만 이것이 OP가 의미하는 바를 심각하게 의심합니다. 왼쪽 결합 된 열이 조건을 만족하지 않는 경우 ('null'이 될지라도) 귀하의 코드는'periodlist.versioncode =? '가있는 모든 레코드를 제공합니다. * 때로는 * 정확하게 당신이 원하는 것이지만 * 대부분의 경우 * 그렇지 않습니다. 대부분의 경우 왼쪽으로 조인 된 열을 필터링하고 값이 일치하지 않는 행을 제거하려고합니다. – GSerg