복붙노트

[SQL] MySQL은 SELECT는 NOT IN이 (SELECT가 B의 X) WHERE A로부터 X - 예기치 않은 결과를

SQL

MySQL은 SELECT는 NOT IN이 (SELECT가 B의 X) WHERE A로부터 X - 예기치 않은 결과를

나는 아래의 세 번째 쿼리의 결과는 식 (732)을 포함 할 것으로 예상된다. 그것은하지 않습니다. 왜 그런 겁니까?

mysql> SELECT id FROM match ORDER BY id DESC LIMIT 5 ;
+------------+
|         id |
+------------+
|        732 | 
|        730 | 
|        655 | 
|        458 | 
|        456 | 
+------------+
5 rows in set (0.00 sec)

mysql> SELECT id FROM email ORDER BY id DESC LIMIT 5 ;
+------------+
|         id |
+------------+
|        731 | 
|        727 | 
|        725 | 
|        724 | 
|        723 | 
+------------+
5 rows in set (0.00 sec)

mysql> SELECT * FROM match WHERE id NOT IN ( SELECT id FROM email ) ;
Empty set (0.00 sec)

세 개의 테이블 email.id에서 NULL 항목 및 match.id 없음 NULL의 항목이 있습니다.

전체 테이블 / 쿼리 http://pastebin.ca/1462094에서 볼 수있다

해결법

  1. ==============================

    1.문서에서 :

    문서에서 :

    이것은 정확히 경우입니다.

    WHERE 절에 대한 허용 조건없는 복귀 NULL 모두 IN과 NOT.

    다음과 같이 쿼리를 다시 작성 :

    SELECT  *
    FROM    match m
    WHERE   NOT EXISTS
            (
            SELECT  1
            FROM    email e
            WHERE   e.id = m.id
            )
    
  2. ==============================

    2.... 또는 당신은 정말 당신이 사용할 수 있지 사용하려는 경우

    ... 또는 당신은 정말 당신이 사용할 수 있지 사용하려는 경우

    SELECT * FROM match WHERE id NOT IN ( SELECT id FROM email WHERE id IS NOT NULL)
    
  3. ==============================

    3.내가 널 얼마나 MySQL의 거래의 세부 사항과 연락을 밖으로 조금 해요,하지만 여기에 시도하는 두 가지이다 :

    내가 널 얼마나 MySQL의 거래의 세부 사항과 연락을 밖으로 조금 해요,하지만 여기에 시도하는 두 가지이다 :

    SELECT * FROM match WHERE id NOT IN 
        ( SELECT id FROM email WHERE id IS NOT NULL) ;
    
    SELECT
        m.*
    FROM
        match m
        LEFT OUTER JOIN email e ON
            m.id = e.id
            AND e.id IS NOT NULL
    WHERE
        e.id IS NULL
    

    다음 WHERE 조건을 두 번째 쿼리 외모는 직관적 인 카운터,하지만이 조인 조건을 수행합니다. 이 경우입니다 조인 어디 절은 해당되지 않습니다.

  4. ==============================

    4.여기에 실제로 의미가 일부 SQL은 다음과 같습니다

    여기에 실제로 의미가 일부 SQL은 다음과 같습니다

    SELECT m.id FROM match m LEFT JOIN email e ON e.id = m.id WHERE e.id IS NULL
    

    간단한 항상 낫다.

  5. from https://stackoverflow.com/questions/1001144/mysql-select-x-from-a-where-not-in-select-x-from-b-unexpected-result by cc-by-sa and MIT license