2016-07-26 2 views
1

를 제외하는 세 개의 테이블 만 하나의 시청에 가입하세요 누가 수수료를 지불했으나 SUSPENDED이 아닙니다.SQL LEFT 내가 3 개 테이블</p> <ul> <li>학생</li> </ul> <p>나는 학생들의 세부 사항을 얻으려면 일시 중단 된</li> <li>FEES_PAID</li> <li>이 내용을

SELECT 
    ID 
FROM 
    STUDENTS s 
LEFT JOIN 
    SUSPENDED p ON s.ID = p.ID 
INNER JOIN 
    FEES_PAID f ON f.ID = s.ID 
WHERE 
    s.ID IS NULL 

불행히도 이것은 작동하지 않습니다. 아무도 효율적인 쿼리를 제안 할 수 있습니까?

미리 감사

+1

인가? * 방언에 따라 '존재하지 않음'이 약간 더 빠르거나 크게 나타날 수 있습니다 (별칭의 이름이 ** ** ** 무엇인지 의미하는 예입니다.) * – MatBailie

답변

0

이 작동합니다 :`NULL` p.ID WHERE를

SELECT 
    s.ID 
FROM 
    STUDENTS s 
LEFT JOIN 
    SUSPENDED p 
     ON s.ID=p.ID 
INNER JOIN 
    FEES_PAID f 
     ON f.ID= s.ID 
WHERE 
    p.ID IS NULL 
2

에 당신은 표는 LEFT JOIN에서 누락되어 있는지 확인해야합니다. 따라서, 당신은 그 테이블에있는 컬럼을 볼 필요가 있습니다. 또한

WHERE p.ID IS NULL 

, NOT EXISTS를 사용 : 다음은 WHERE로 변경이 두 쿼리, 당신이에서 오는 테이블을 지정 SELECTID을 한정해야한다는

SELECT s.ID 
FROM STUDENTS s INNER JOIN 
    FEES_PAID f 
    ON f.ID = s.ID 
WHERE NOT EXISTS (SELECT 1 FROM SUSPENDED p WHERE s.ID = p.ID); 

참고.

+0

방언에 따라 '존재하지 않음' 느린. 'LEFT JOIN'은'NOT NULL'을 제 경험에 더 일반적으로 적용 할 수 있습니다. – MatBailie

+0

@MatBailie. . . 나는 실제로 그것을 명료하게하기 위해 제안했다. OP는 조인에 약간 혼란스러워 보였으므로이 논리를 'WHERE' 절로 이동하면 조인에 중점을 둡니다. –