2012-05-08 1 views
0

두 테이블을 가지고 있는데,이 두 테이블 사이의 공통 필드가 정확히 일치하는 행을 선택하려고하지만 쿼리를 작성하기가 어렵습니다. 여기에 단순화 된 버전입니다 :작은 솔루션 세트를 위해 거대한 결과 테이블을 생성하는 Mysql join

표는이 (간체)처럼 : 나는 함께 경우에만 t1.sn = t2.sn t1.name 및 t2.loc을 얻으려고

 
T1: 
    id, name, sn 

T2: 
    id, location, sn 

. sn 필드는 둘 다 고유하므로 테이블 사이에 하나의 레코드 만 일치합니다. t1에서 모든 레코드는 sn 필드 값을 갖지만 t2에서는 약 30 %가 sn에 대해 NULL을 갖습니다. 그래서, 나는 조인이 t1보다 약간 적은 행을 생성 할 것으로 기대합니다.

어떻게 가입합니까?

감사합니다.

샘플 데이터 : 위 예에서

 
t1: 
+---+--------+-------+-----+ 
| id| name | sn | ... | 
+---+--------+-------+-----+ 
| 1 | thing1 | 12345 |  | 
| 2 | thing2 | 10000 |  | 
| 3 | thing3 | 33445 |  | 
| 4 | thing4 | 99223 |  | 
+---+--------+-------+-----+ 

T2: 
+----+--------+-------+-----+ 
| id | loc | sn | ... | 
+----+--------+-------+-----+ 
| 90 | here | 12345 |  | 
| 92 | there | NULL |  | 
| 96 | near | 33445 |  | 
| 99 | far | 99223 |  | 
+----+--------+-------+-----+ 

Result: 
+--------+-------+-------+ 
| name | loc | sn | 
+--------+-------+-------+ 
| thing1 | here | 12345 | 
| thing3 | near | 33445 | 
| thing4 | far | 99223 | 
+--------+-------+-------+ 
+0

, 유사한 무언가 "이름, LOC, t1.sn t2.sn = T2에서 T1로부터 가입 t1.sn 선택". 쿼리가되는 생각은 sn 값이 일치하는 행을 반환합니다. 내 실제 DB에는 30k 행이 있고, 실행 및 대기를 설정하면 결국 쿼리를 종료하기 전에 결과 테이블에 약 400k 행이 있습니다. – AaplMike

+0

t2.sn의 단일성을 확인하기 위해 이것을 시도하십시오 : t1에서 nb로 count (1)을 선택하십시오. t1에서 내부 결합 t2 on (t1.sn = t2.sn) nb> 1을 갖는 그룹 t1.id – Keil

+0

@MikeC : 그러나 당신이 얻고있는 400k 결과는 틀린가? 당신의 질문은 실제로 그 쿼리의 성능을 향상시키는 방법에 관한 것입니까? (첫 번째 대답은 각각의'sn' 열에서 두 테이블 모두에 인덱스가 있음을 보장합니다)? – eggyal

답변

1
SELECT 
    t1.name AS name, 
    t2.loc AS loc, 
    t1.sn AS sn 
FROM t1 
INNER JOIN t2 ON t1.sn=t2.sn 
+0

@ 그것이 명확하게 밝혀졌다. 프로덕션 DB의 구조와 샘플의 구조가 다르다. 'INNER JOIN'만이 최소 조인 된 테이블보다 더 많은 레코드를 제공 할 수 없습니다. (joinfield가 unque 인 경우) –

+0

답변 해 주셔서 감사합니다, Eugen. 그것은 많은 것을 설명하고, 내가 제공 한 데이터를 되돌아 보면 초기 전제가 정확하지 않다는 것을 알게되었습니다. t2에 중복 된 sn이있어 고유 한 값을 기대치를 초과하는 결과를 초래합니다. 당신의 공헌에 감사드립니다. – AaplMike