2010-07-26 3 views
1

가정하자 나는이 다음 표SQL 가입

Students (StudentId int Pk, StudentName nvarchar) 
Lectures (LectureId Pk, StartDate, EndDate) 
Enrollment (StudentID, LectureID) 

예상보다 많은 행을 검색 나는 다음과 같은 쿼리를 실행하면 :

select StudentID From Students 

를 내가 얻을 8 행 .. 그리고 난 실행 :

select S.StudentID From Students S join Enrollment En On S.StudentID = En.StudentID 

내가받을 11 행

왜 그런가요? 추가 행을 검색하지 않고 join을 사용하는 방법은 무엇입니까?

+0

유는 11 개 행이 어떤 학생을 coze 얻을 u는 선택을 할 경우 (자세한 후 1 개 강의를 S.StudentID에 의해 S.StudentID = En.StudentID 그룹에 등록 욕실에 가입 enroment의 u가 보일 것이다), u는 Distinct를 사용할 수 있었으므로 학생을 한 번만 얻을 것이지만, 나는이 문제를 slove로 생각하지 않는다. – domiSchenk

답변

3

귀하의 가입에 문제가 없습니다.

이것은 학생 당 등록이 두 개 이상 있음을 의미합니다. 학생들은 학생이 한 번에 하나 개의 강의에 등록 할 수 있다고 가정하면 강의

하나 이상의 강의/시리즈에 가입 한 후, 당신은 또한 강의에 참여하고 또한 날짜 필드

를 사용해야합니다, 학생이 현재 아무 것도 등록하지 않은 경우, 왼쪽 외부 조인을 고려해야합니다.

그래서 쿼리는

SELECT S.StudentID FROM Students S 
LEFT OUTER JOIN Enrollment En On S.StudentID = En.StudentID 
INNER JOIN Lectures l ON en.LectureId = l.Lecture ID 
WHERE getdate() BETWEEN l.StartDate and l.EndDate 

처럼 보일 수 있습니다하지만 당신은

(즉, 당신이 기대했던 참 인 경우) 학생이 동시에 하나 개 이상의 강의를 등록 할 수 있도록 장소에서 규칙을 가지고해야합니다

HTH

0

사용 왼쪽은

편집 가입 : 신경 끄시 고, 그것은 아래/위/무엇을 말한다. 강의/등록이 여러 개인 학생이 있어야합니다. 8 행을 다시 얻으려면 학생별로 그룹화해야합니다.

는 학생들 S에서 S.StudentID을 선택 는

+0

Most. 편치 않은. 대답. 이제까지. – cjk