2017-03-25 1 views
3

이 같은 간단한 데이터베이스 스키마를 가지고 : Child one----many SchoolPreferences그룹을 선택하는 경우에만

어린이 표는 구성이입니다

PreferenceId, ChildId, PreferenceNumber, SchoolName 

:

ChildId, Name, Surname, Age 

SchoolPreferences의 구성 학교에 대한 재교육. 각 어린이는 원하는 곳에 최대 3 개 학교를 선택할 수 있습니다. PreferenceNumber 1에 합격하면 학교로갑니다. PreferenceNumber 2에 도달하지 못하면 PreferenceNumber 2에 도달하고 그곳에서 실패하면 마지막 기회는 세 번째 선호 학교에 있습니다.

PreferenceNumber 1로만 선택한 학교를 선택해야합니다. 따라서 어떤 어린이가 학교를 PreferenceNumber 2 또는 3으로 선택하면 결과에 나타나지 않아야합니다.

지금까지 개별 행을 선택하는 방법 만 알고 있었지만 필요한 것은 그룹을 필터링하여 각 학교가 그룹이고 환경 설정> 1 인 경우이 전체 그룹이 결과에 나타나서는 안됩니다.

은 지금까지 나는이 문제를 가지고 있지만, 내가 말했듯이 그것은 단지 개별 행이 아닌 학교 일 :

select SchoolPreferences.PreferenceId, 
    Children.name, 
    Children.Surname 
from Children 
inner join SchoolPreferences on Children.ChildId = SchoolPreferences.ChildId 
group by SchoolPreferences.PreferenceId, 
    Children.name, 
    Children.Surname 
having (((SchoolPreferences.PreferenceNumber) = 1)); 

답변

1

안티 조인 트릭을 할 것 패턴. 어린이 테이블은 필요하지 않습니다. 학교에 유일한 식별자가 schoolname 인 것 같습니다. 내가 사양을 이해하고있어 경우

,

뭔가 이런 식으로 ... ONLY preferencenumber 1로 나타나 학교 목록 (schoolname)을 반환하고, 다른 preferencenumber으로 표시되지 않은 :

SELECT p1.schoolname 
    FROM SchoolPreferences p1 
    LEFT 
    JOIN SchoolPreferences pn 
    ON pn.schoolname = p1.schoolname 
    AND pn.preferencenumber <> 1 
    WHERE pn.schoolname IS NULL 
    AND p1.preferencenumber = 1 
    GROUP 
    BY p1.schoolname 

동일한 결과를 반환하는 다른 쿼리 패턴이 있습니다 (예 : 우리가 preferencenumber 1과 학교에 있던 어린이를 포함 찾고 있다면

SELECT p1.schoolname 
    FROM SchoolPreferences p1 
    WHERE p1.preferencenumber = 1 
    AND NOT EXISTS 
     (SELECT 1 
      FROM SchoolPreferences pn 
      WHERE pn.schoolname = p1.schoolname 
      AND pn.preferencenumber <> 1 
     ) 
    GROUP 
    BY p1.schoolname 

, 우리는 GROUP BY를 제거하고 우리는

SELECT p1.schoolname 

     , p1.preferenceid 
     , p1.childid 
     , ch.name 
     , ch.surname 

    FROM SchoolPreferences p1 

    JOIN Children ch 
    ON ch.childid = p1.childid 

    LEFT 
    JOIN SchoolPreferences pn 
    ON pn.schoolname = p1.schoolname 
    AND pn.preferencenumber <> 1 
    WHERE pn.schoolname IS NULL 
    AND p1.preferencenumber = 1 

    ORDER 
    BY p1.schoolname 
     , p1.childid 
+0

감사가 Children 테이블에 가입 할 수있다 , 큰 작품 :) – FCin

관련 문제