2012-08-15 2 views
2

두 테이블이 있습니다 : teacher_lm 및 teacher. 이 테이블에는 "teacher_email"열이 있습니다.하나의 테이블에는 레코드가 있지만 다른 테이블에는 레코드가 없습니다.

필요한 것은 teacher_lm에는 있지만 teacher에는없는 전자 메일을받는 것입니다.

이 문제를 해결하기 위해 두 가지 접근 방법이 있지만 왜 그 중 하나가 결과를 제공하지 않으며 다른 하나는 많은 행을 반환하는지 이해할 수 없습니다.

먼저 하나를 842 행

SELECT DISTINCT lm.teacher_email 
FROM  teacher_lm as lm 
WHERE  NOT EXISTS (SELECT * FROM teacher as lt 
     WHERE lt.teacher_email = lm.teacher_email   
    ) 

두 번째 하나는 결과가 없습니다

SELECT DISTINCT lm.teacher_email FROM 
teacher_lm AS lm 
WHERE lm.teacher_email NOT IN 
(SELECT lt.teacher_email FROM 
teacher AS lt) 

당신이 말해 줄 수는 내가 잘못 여기서 뭘하는지, 그리고이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

감사합니다.

답변

6

"in"하위 쿼리에는 아마도 NULL이 포함되어 있습니다.

이 대신보십시오 :

그런데
SELECT DISTINCT lm.teacher_email 
FROM teacher_lm AS lm 
WHERE lm.teacher_email NOT IN (SELECT coalesce(lt.teacher_email, '') 
           FROM teacher AS lt) 

, 나는 첫 번째 버전이 최적화 이유로 MySQL의 권장 버전입니다 생각합니다.

+0

감사합니다. 당신은 맞았어요 :) 지금 그것은 같은 수의 결과를주었습니다. IN 하위 쿼리는 EXIST보다 몇 년 더 오랜 시간이 걸렸습니다. 다시 한 번 감사드립니다 :) – Vika

+0

@Vika. . . 혹시 다른 데이터베이스를 사용하는 경우에 대비하여 INIS보다 나은 EXISTS의 특성은 mysql에만 해당됩니다. 다른 데이터베이스에서는 그렇지 않을 수도 있지만, 다른 데이터베이스 엔진은 IN을 최적화하고 더 좋지는 않습니다. –

1

첫 번째 쿼리는 전체 행의 존재에 대해 작업하고 있습니다.

두 번째 쿼리가 null을 반환 할 수 있습니다. NOT IN 절이 null이있는 상태에서 잘 작동한다고 저는 믿지 않습니다.

고든의 대답은 nulls를 빈 문자열로 대체하여이를 수정합니다.

관련 문제