2012-10-08 5 views
1

LongTableShortTable의 두 테이블이 있습니다. 예를 들어, LongTable 보이는 같은 :매우 큰 SQL 테이블에서 레코드의 서브 세트 선택

PersonA 
1 
2 

내가 약 2.000 즉,이 테이블 정말 긴 점에 유의하시기 바랍니다 (A LongTable에서 레코드를 선택하는 방법을 궁금해 :

personA | personB 
1 | 2 
1 | 3 
2 | 4 
2 | 5 
3 | 4 
3 | 5 
3 | 6 
4 | 5 
4 | 6 

ShortTable 다음과 같은 내용이있다 .000 행)의 레코드를 기반으로합니다 (ShortTable). 그래서,이 특별한 경우에 대한 결과는 다음과 같아야합니다 ("테이블을 다시 열 수 없습니다 : 'ShortTable'"하지만 장애를 가진) :

personA | personB 
1 | 2 
1 | 3 
2 | 4 
2 | 5 

나는 다음과 같은 쿼리를 시작

SELECT * FROM LongTable 
    WHERE 
    personA IN (SELECT * FROM ShortTable) 
    AND 
    personB IN (SELECT * FROM ShortTable) 

코드 임시 테이블을 재생산하는 방법은 다음과 같습니다.

미리 알려 주셔서 감사합니다.

CREATE TABLE LongTable (
    personA INT, 
    personB INT 
); 

INSERT INTO LongTable VALUES 
(1,2),(1,3),(2,4), 
(2,5),(3,4),(3,5), 
(3,6),(4,5),(4,6); 

CREATE TABLE ShortTable (
    personA INT 
); 

INSERT INTO ShortTable VALUES 
(1),(2); 
+0

왜 1과 2입니까? 사람 b는 2,3,4,5입니까? –

+1

@ 존우 'longtable.PersonA' = 1, 2는'shorttable.PersonA'와 같습니다. –

+0

오 다른 테이블에서 왔습니다 .grr는 그것을 보지 못했습니다. –

답변

2

SELECT DISTINCT l.personA, l.personB 
FROM longTable l 
INNER JOIN ShortTable s ON l.personA = s.personA 
1

당신이 사용할 수보십시오 : 오히려 쿼리보다는, 실행 시간은 보통 테이블 구조 (예 : 인덱스) 의존

SELECT * FROM LongTable 
WHERE personA IN (SELECT * FROM ShortTable) 

참고

1

MySQL에서이 작업을 수행하는 가장 빠른 방법은 longTable.personA에 색인을 만드는 것입니다. 그런 다음 다음 쿼리를 수행하십시오.

select l.personA, l.personB 
from longTable l 
where exists (select 1 from shortTable s where s.PersonA = l.PersonA limit 1) 
관련 문제