2010-06-25 2 views
2

제목이 충분히 명확하길 바랍니다. 나는 다음과 같은 하나의 기능을 복제하는 단일 쿼리를 찾고 있어요,하지만 서브 쿼리 사용하지 않고 :하나의 키에는 값이 있지만 다른 하나의 키에는 값이없는 행을 찾기위한 단일 SQL 쿼리

여기
a_id | p_id 
1 | 1 
1 | 2 
2 | 2 

, p_id : 예를 들어

select p_id from a_p 
where a_id=1 
    and p_id not in (select p_id from a_p where a_id=2) 

을, 테이블 a_p는 다음과 같은 행이 1은 a_id 1에는 존재하지만 a_id 2에는 존재하지 않습니다 - 위의 쿼리는 p_id 1만을 반환합니다. 어떤 아이디어입니까? 하위 쿼리를 사용할 수있는없이

+2

하위 쿼리를 사용하지 않아도되는 이유는 무엇입니까? 너는 그걸로 수갑을 채우는 것 같아. – Toby

+2

@Toby : 하위 쿼리가 무엇이며 최적화 프로그램이 어떻게 처리하는지에 대한 오해 ... –

답변

1

은 LEFT OUTER JOIN을 사용하여 당신을 떠나는/NULL IS :

SELECT a.p_id 
    FROM A_P a 
LEFT JOIN A_P b ON b.p_id = a.p_id 
       AND b.a_id = 2 
    WHERE a.a_id = 1 
     AND b.p_id IS NULL 

는 하위 쿼리 성능이 모든 데이터베이스 공급 업체에서 동일하지 않습니다주의하십시오. PostgreSQL과 Oracle에서는 NOT IN, NOT EXISTS 및 LEFT JOIN/IS NULL이 모두 동일합니다. MySQL에서만 LEFT JOIN/IS NULL이 더 효율적입니다.

+0

감사합니다. – user376511

관련 문제