programing

MySQL SELECT x from a where not in (b에서 x 선택) - 예기치 않은 결과

yellowcard 2023. 9. 7. 21:37
반응형

MySQL SELECT x from a where not in (b에서 x 선택) - 예기치 않은 결과

아래 세번째 쿼리의 결과는 id=732를 포함할 것으로 예상합니다.그렇지 않아요.왜 그런 것일까요?

mysql> ID Description 5에 의해 일치 순서에서 ID를 선택합니다;+------------+|         id |+------------+|        732 ||        730 ||        655 ||        458 ||        456 |+------------+세트 5개 행(0.00초)
mysql> ID Description 5에 의해 이메일 주문에서 ID를 선택합니다;+------------+|         id |+------------+|        731 ||        727 ||        725 ||        724 ||        723 |+------------+세트 5개 행(0.00초)
mysql>SELECT * From match where id not in (SELECT id from e-메일에서 SELECT id);빈 세트(0.00초)

email.id 테이블에는 3개의 NULL 항목이 있고 match.id 에는 NULL 항목이 없습니다.

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

설명서에서:

준수하기 위해SQL표준.IN돌아온다NULL왼쪽 표현이 다음과 같은 경우에만 해당되는 것은 아닙니다.NULL, 또한 목록에서 일치하는 것이 발견되지 않고 목록에서 표현 중 하나가 다음과 같은 경우에도NULL.

이것이 바로 당신의 경우입니다.

둘다요.IN그리고.NOT IN돌아가다NULL그것은 수용할 수 없는 조건입니다.WHERE

쿼리를 다음과 같이 다시 작성합니다.

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

... 아니면 정말로 사용하고 싶다면.NOT IN사용가능

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

MySQL에서 null을 어떻게 처리하는지에 대한 세부 사항은 잘 알지 못하지만, 다음 두 가지를 시도해 볼 수 있습니다.

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 조건을 수행합니다.이것은 조인과 절이 동등하지 않은 경우입니다.

다음은 실제로 의미가 있는 몇 가지 SQL입니다.

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

언제나 간단한 것이 좋습니다.

언급URL : https://stackoverflow.com/questions/1001144/mysql-select-x-from-a-where-not-in-select-x-from-b-unexpected-result

반응형