2012-02-23 3 views
0

두 개의 테이블이 있습니다.MySQL 교차 선택 제한 문제

T1에는 9000 개의 고유 레코드 (varchar)가있는 하나의 열이 있습니다.

T2에는 100 만 개가 넘는 레코드가있는 많은 열이 있습니다. T2의 열 T2.x 중 하나에 T1의 열 T1.x의 데이터가 있지만 일부 T2 레코드의 열에 T2.x의 데이터가 T1의 열 T1.x에 없습니다. T2.x도 NULL 일 수 있습니다.

나는 T2.x 그러나

I tried = SELECT t1.column_x, t2.* from t1, t2 WHERE x = t1.x 

T1.x

일치하는 기록이 목록에만 T2에 존재하는 많은 사람들을 무시하고 9000 개 레코드가 T2의 모든 레코드를 나열하고 싶습니다.

내가 추구하는 것을 어떻게 달성 할 수 있습니까?

1-2-5-6-7 감사합니다 :

e.g. 

**t1 [x] 
===** 
a 
b 
c 

**t2 
===**  [x] 
1 .. .. .. a 
2 .. .. .. b 
3 .. .. .. eee 
4 .. .. .. NULL 
5 .. .. .. c 
6 .. .. .. a 
7 .. .. .. c 

나는 싶어.

답변

1

간단하게 다음과 같이 작동합니다. x 열이 모두 VARCHAR 인 것으로 간주하여 테이블의 크기에 성능 문제가 발생할 수 있습니다.

SELECT 
    t2.* 
FROM t2 
INNER JOIN t1 
ON t1.x = t2.x 

그래서 그 쿼리 속도를 향상 도움이 될 것처럼 당신이 이미 t1t2 모두에서 x 컬럼에 인덱스를 가지고 있습니까. 프로덕션 환경에서이 쿼리를 실행하지 않는 것이 좋습니다. 불가피한 경우 영향을 최소화하기 위해 LIMIT 10 (또는 필요한 많은 행)을 포함하도록 권유해야합니다.

+0

대단히 감사합니다. 그것은 완벽하게 작동했습니다. 이는 개발 목적으로 만 사용됩니다. 나는 큰 데이터베이스를 재구성하고있다. 기회가 있다면 count()를 선택하고 싶다면이 쿼리로 어떻게 할 수 있습니까? 시도했지만 오류가 발생했습니다. 호기심에서 벗어났습니다. 고맙습니다. – Phil

+0

'선택 COUNT (*) FROM t2 INNER JOIN t1 ON t1.x = t2.x'는 (필드 데이터를 요구하지 않는 한) 총 행 수만 반환합니다. –