2013-11-03 4 views
0

나는 대학교 동창들의 Access 데이터베이스를 받았다. 여기에는 각 학생이 다니는 학교의 세부 사항, 특히 이들 학교가 주정부 또는 유료 학교인지 여부가 포함됩니다. 동일한 학생 기록이 예컨대 복수의 열 분산되어 저장되도록SQL : 동일한 개인을 나타내는 여러 레코드 내에서 쿼리하기

 
StudentID AgeStart AgeFinish State_Fee 
----------------------------------------------------------- 
23   5   10   state 
23   10   18   state 
24   6   9   state 
24   9   12   fee 
24   12   18   fee 

기본 키가 StudentID + AgeStart이다 : 여기 해당 테이블의 구조의 간략화 된 버전이다 위의 학생 23 두 주립 학교에 참석했다. 24 명의 학생은 3 개의 학교에 다녔으며, 그 중 하나는 주를, 2 개는 유료입니다.

나는 몇 명의 사람들이 학교 전체를 사립/유료 교육에 보냈습니까? SQL에서이 사람들을 선택할 수 있습니까? 학생들은 전 세계에서 왔고 여러 연령대의 학교를 시작하고 끝내기 때문에 고민 중입니다. '이 ID의 모든 발생에 대해 State_paid = 2 인 StudentID를 선택하십시오'라고 말할 수 있어야합니다. 누구든지 어떤 아이디어?

답변

1

이것은 결코 주립 학교에 다니지 않은 모든 학생들을 찾을 것입니다.

SELECT DISTINCT StudentID FROM alumni 
WHERE StudentID NOT IN (
    SELECT StudentID FROM alumni WHERE State_Fee = 'state' 
) 
+0

감사합니다. 환상적입니다. 나는 그것으로 나이 들었던 나의 머리를 덜컥 덜컥 울리고 있었다. – MartinC

+0

@ user2950853, 나중에 참조 할 수 있도록 'EXISTS (매우 비슷한 것)'에 대해서도 읽어보십시오. –

+0

좋아요, 제가 살펴 보겠습니다. 감사! – MartinC

1

이 질문에 대답하는 또 다른 방법은 having 절을 집계를 사용하는 것입니다. 이러한 방식의 쿼리에서는 더 일반적이기 때문에이 방식을 선호합니다. (이것은 셋 내에-세트 쿼리의 일례이다.)

select StudentId 
from t 
group by StudentId 
having sum(iif(State_Fee = "state", 1, 0) = 0; 

무엇 having 절하고있는 것은 각 "state"StudentId 발생 횟수를 카운트한다. 그러한 레코드가 없을 때 StudentId은 테스트를 통과합니다.