2012-10-17 4 views
2

다른 테이블의 ID를 기반으로 내 테이블의 행을 제외하려고합니다.하나의 집합에서 여러 하위 쿼리 결과 결합

(1,2,3) + (4,5) = (1,2,3,4,5) 
: 나는이 (1,2,3)

내가 좋아하는, 하나에이 두 하위 쿼리의 결과를 결합하려고 같은 세트의 결과 "SELECT * FROM"그 중 두 테이블이

큰 테이블을 "NOT IN (1,2,3,4,5)"으로 필터링 할 수 있습니다.

GROUP_CONCAT 's, UNION 및 기타 모든 종류를 살펴 보았지만 그럴 수없는 것 같습니다. 실제로 작동하는 것을 찾으십시오.

누구나 아이디어가 있으십니까?

답변

1
select * 
from Table3 
where id not in (
    select id from Table1 --your subquery that returns 1,2,3 
    union all 
    select id from Table2 --your subquery that returns 4,5 
) 
+0

는 "모두가"필요하지 않습니다. 반복되는 값을 가진 하위 목록을 원하지 않습니다. UNION 또는 명시 적 UNION DISTINCT이어야합니다. http://dev.mysql.com/doc/refman/5.0/en/union.html –

+1

@LastCoder 해당 사항 없음. 'ALL'을 제거하면 쿼리가 중복을 제거하기 위해 추가 작업 (정렬)을 수행해야합니다. 예를 들어 목록의 첫 번째 항목이 일치하면 낭비입니다. 이것은'IN' 절에서 사용할 하위 쿼리를 만들 때'DISTINCT'를 사용하지 않아야하는 것과 같은 이유입니다. – RedFilter

+0

이것은 가능한 경우이 내부 구조에 대해 자세히 설명 할 수있는 매우 흥미로운 내용입니다. UNION DISTINCT가 주 쿼리에 사용될 HashSet ADT를 생성하는 것처럼 보이고, UNION ALL도 반복되는 값을 무시합니다 (어쨌든). UNION DISTINCT는 프로그래밍 방식으로는 보이지 않지만 (항상 ALL과 DISTINCT의 경우 Set를 작성하는 것이 O (N)이되기 때문에) 분류를 강제로 수행하도록 정렬을 수행한다고 말합니다. –

0
select * from mytable 
where id not in (
    select id from othertable 
    union 
    select id from othertable2 
) 
관련 문제