2015-01-05 2 views
0

두 개의 테이블, 사람 및 차량이 있습니다. 차량은 사람들에게 속합니다. 사람이 차량을 가지고 있지 않은지 확인하려하고있다. 나는 사람과 차량에 가입하고 Vehicles.person_id에없는 사람 ID를 표시하여이 작업을 시도했습니다."NOT IN"Postgres를 사용하는 올바른 방법

이것은 아무 것도 반환하지 않으며 내가 잘못한 것이 있는지 또는이 작업을보다 효율적으로 수행 할 수 있는지 궁금합니다. (Select id From People WHERE id NOT IN에 의해)에없는 모든 사람 SELECT distinct person_id FROM Vehicles에 의해 차량을 가지고 모든 사람의 목록을 선택

Select id 
From People 
WHERE id NOT IN (SELECT distinct person_id 
       FROM Vehicles 
       WHERE person_id IS NOT NULL) 

:

쿼리는 다음과

Select People.id From People INNER JOIN Vehicles on People.id=Vehicles.person_id where People.id NOT IN Vehicles.person_id;

답변

2

사용 issues with NULL values을 가질 수없는 차량

Select distinct People.id 
    From People 
    LEFT JOIN Vehicles on  People.id=Vehicles.person_id 
    where Vehicles.person_id is NULL 
+0

하나의 사람이 많은 차량을 소유 할 수 있다면'DISTINCT 선택 '을 원할 수 있습니다. –

+0

@BaconBits, 입력을 주셔서 감사합니다 – radar

+0

이것은'where not in'보다 훨씬 빠르게 실행됩니다. – Jasen

0

사용 부질 이하 (당신이 원한다면 여기에서도 null을 피할 수 있습니다.)

+0

아를, 좋은. 그러나 이것은 아무것도 반환하지 않습니다. 어떤 제안? –

+0

차량을 소지하지 않은 사람들이 있습니까? 그것은 나를 위해 작동합니다 ... – SMA

+1

@ColtonSeal : 아마도'person_id' 열에'null' 값이있을 것입니다. sub-select에서'person_id가 null이 아닌 차량으로부터'select person_id를 사용하십시오.) –

1

다른 솔루션을 사용하여 세트 :

Select id From People 
except 
SELECT person_id FROM Vehicles 
2

NOT IN으로 사람을 알아 내기 위해 가입 왼쪽과 하위 쿼리하면 아마 performance reasons을 위해 피해야한다 매우 큽니다.

NOT EXISTS을 시도해보십시오

SELECT p.id 
FROM People p 
WHERE NOT EXISTS (
    SELECT 1 
    FROM Vehicles v 
    WHERE v.person_id = p.id) 
관련 문제