2012-12-07 3 views
5

전자 메일 (기본 키)과 인증서가 포함 된 StudentCerts와 인증서 및 코스가 포함 된 CertReqs라는 두 개의 테이블이 있습니다. 표의 일부는 다음과 같이 보일 수 있습니다.까다로운 SQL Join 쿼리

 StudentCerts:         CertReqs:  
Email   Certificate    Certificate   Course 
[email protected]  Programmer   Programmer   CS 101 
[email protected]  English    Programmer   CS 202 
[email protected]   Econ     Programmer   CS 303 
[email protected]  Programmer   English    ENG 101 
             English    ENG 102 
             Econ     ECON 102 
             Econ     ECON 304 
             Art     Art 101 
             Art     Art 102 
             Journalism   J 101 
             Journalism   J 202 

내가 시도한 것은 특정 학생이 속하지 않은 모든 인증서를받는 것입니다. 예를 들어, [email protected]은 Programmer와 English 인증서에 모두 등록되어 있으며 특정 학생이 등록되지 않은 CertReqs의 모든 인증서를 반환하는 SQL 문을 얻고 싶습니다. 따라서이 예제의 경우 Econ, Art, Journalism을 반환해야합니다. Ive는 이것을 얼마 동안 얻으려고 애 쓰고 있었기 때문에 어떤 도움이라도 대단히 감사 할 것입니다 !!

답변

2
SELECT cr.Certificate FROM CertReqs cr 
WHERE cr.Certificate NOT IN (
    SELECT sc.Certificate FROM StudentCerts sc 
    WHERE sc.Email = '[email protected]' 
); 

쿼리는 "학생이 속한 모든 CertReq를 원합니다."라는 요구 사항을 거의 읽습니다.

+0

너무 감사합니다! 이것은 정확하게 내가하려고했던 것을했다! – user1875195

0

이것은 당신이 다음 특정 이메일에 대해 원하는 경우

SELECT DISTINCT x.* 
FROM 
    (
     SELECT a.Email, b.Certificate 
     FROM (SELECT DISTINCT Email FROM StudentCerts) a 
       CROSS JOIN 
       (SELECT DISTINCT Certificate FROM CertReqs) b 
    ) x LEFT JOIN studentCerts y 
     ON x.Email = y.Email AND 
      x.Certificate = y.Certificate 
WHERE y.Email IS NULL 
ORDER BY x.EMAIL 

당신은 추가 조건을 추가 할 필요가 특정 인증서가없는 모든 학생을 나열합니다

SELECT DISTINCT x.* 
FROM 
    (
     SELECT a.Email, b.Certificate 
     FROM (SELECT DISTINCT Email FROM StudentCerts) a 
       CROSS JOIN 
       (SELECT DISTINCT Certificate FROM CertReqs) b 
    ) x LEFT JOIN studentCerts y 
     ON x.Email = y.Email AND 
      x.Certificate = y.Certificate 
WHERE y.Email IS NULL AND 
     x.Email = '[email protected]' 
ORDER BY x.EMAIL 
0
SELECT Certificate FROM `CertReqs` 

WHERE Certificate NOT in(
    SELECT Certificate 
    FROM `StudentCerts` 
    WHERE Email = '[email protected]' 
) 
1

게임에 조금 늦게하지만, 간단한 LEFT JOIN 아주 잘 이러한 문제를 해결 :

SELECT DISTINCT cr.Certificate 
FROM CertReqs cr 
LEFT JOIN StudentCerts sc ON cr.Certificate = sc.Certificate AND sc.Email = '[email protected]' 
WHERE sc.Email IS NULL 
0
SELECT DISTINCT A.* fROM 
(
SELECT DISTINCT EMAIL, CERTIFICATE fROM #StudentCerts A 
CROSS JOIN #CertReqs B) A 
LEFT JOIN #StudentCerts B ON A.EmaiL = B.EMAIL AND B.CERTIFICATES = A.Certificate 
WHERE B.EMAIL IS NULL 
ORDER BY A.EMAIL 
+2

스택 오버플로에 오신 것을 환영합니다! 이 코드 스 니펫이 질문을 해결할 수 있지만 [설명 포함] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) 정말 게시물의 품질을 향상시키는 데 도움이됩니다. 앞으로 독자의 질문에 답하고 있으며 코드 제안의 이유를 알지 못할 수도 있습니다. 또한 주석을 설명하기 위해 코드를 군중시키지 마십시오. 그러면 코드와 설명 모두 가독성이 떨어집니다! – Machavity