[postgresql] PostgreSQL ‘NOT IN’및 하위 쿼리

이 쿼리를 실행하려고합니다.

SELECT mac, creation_date
FROM logs
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)

하지만 결과가 없습니다. 나는 그것을 테스트했고 구문에 문제가 있음을 알고 있습니다. MySQL에서는 이러한 쿼리가 완벽하게 작동합니다. 테이블에 mac존재하지 않는 행이 있는지 확인하기 위해 행을 추가 consols했지만 여전히 결과를 제공하지 않습니다.



답변

NOT IN을 사용할 때 값이 NULL이 아닌지 확인해야합니다.

SELECT mac, creation_date
FROM logs
WHERE logs_type_id=11
AND mac NOT IN (
    SELECT mac
    FROM consols
    WHERE mac IS NOT NULL -- add this
)


답변

NOT IN을 사용할 때는 null 케이스를 자동으로 처리하는 NOT EXISTS도 고려해야합니다. PostgreSQL Wiki 참조

SELECT mac, creation_date
FROM logs lo
WHERE logs_type_id=11
AND NOT EXISTS (
  SELECT *
  FROM consols nx
  WHERE nx.mac = lo.mac
  );


답변

LEFT JOIN 및 IS NULL 조건을 사용할 수도 있습니다.

SELECT
  mac,
  creation_date
FROM
  logs
    LEFT JOIN consols ON logs.mac = consols.mac
WHERE
  logs_type_id=11
AND
  consols.mac IS NULL;

“mac”열의 인덱스는 성능을 향상시킬 수 있습니다.


답변