2012-03-16 5 views
0

왼쪽에있는 내 테이블의 모든 행은 오른쪽 테이블에서 하나의 일치 항목 만 가져야합니다 (오른쪽 테이블은 모든 행이있는 마스터 테이블이고 왼쪽 테이블은이 행의 하위 집합 만 포함). 각 테이블의 행의 시간 소인은 정확히 일치하지 않지만 대개 서로 1 초 내에 있습니다. 따라서 테이블에 가입하면 다음을 사용해야합니다.INNER JOIN이 (가) 여러 경기를 반환하지 않게하는 방법은 무엇입니까?

FROM left_table INNER JOIN right_table 
ON left_table.timestamp BETWEEN right_table.timestamp - .00015 AND right_table.timestamp + .00015 
--This is approximately a 2 second wide range since this is a DATETIME field 
AND left_table.name = right_table.name 
AND ........ 

다른 모든 기준은 정확하게 일치합니다. 이 문제를 해결할 방법이 있습니까?

대개의 경우 1 행만 반환 할 수 있지만 두 행이 동일한 경우 두 행이 모두 반환됩니다.

+1

당신은 독특한 시도 할 수, 또는 TOP 1 –

+2

을 방지하는 좋은 방법입니다, 당신은 right_table.timestamp 간의 left_table.timestamp ON 을 의미 않았다 -. 00015 AND right_table.timestamp + .00015 – David

+0

내가 그럴 것 같아. 방금 문제를 재평가하고 "DISTINCT"를 사용하는 한 여러 개의 결과가 반환되는 것이 좋다고 생각합니다. 시간 범위가 너무 좁아서 조인에서 필요한 기준에 적합합니다. 감사! – eek142

답변

1

초 단위까지만 정밀도가 필요한 경우 선택에서 나머지 부분을 잘라낼 수 있습니다.

2

정확해야합니다.

FROM left_table 
INNER JOIN 
    (
    SELECT l.name, min(abs(r.timestamp - l.timestamp)) as offset 
    FROM left_table l 
    INNER JOIN right_table ON r on r.name=l.name 
    GROUP BY l.name 
) lrmap ON left_table.name = lrmap.name 
INNER JOIN right_table 
ON left_table.name = right_table.name 
    AND abs(left_table.timestamp-right_table.timestamp) = lrmap.offset 

나는 뺄셈 느린이기 때문에,하지만, 성능을 보증하고() 함수가 사망 복근 내부에 그들을 배치하지 않습니다 지금 속는을 얻을 수있는 유일한 방법은 그들이 모두 같은 시간에 차이가있는 경우입니다 그 열에 인덱스를 사용할 기회. 지출 할 시간이 많다면 더 많은 인덱스 친화적 인 요소를 조합 할 수 있을지 모르지만, 아마도 이것이 나에게 취약한 테이블 디자인처럼 보이기 때문에 가능하지 않을 수 있습니다. 실제 수정 사항은 다음과 같은 열을 추가하는 것입니다. 더 직접적으로 레코드를 연결합니다.

+0

노력에 감사드립니다. 이 부분을 좀 더 살펴볼 것입니다.하지만 DISTINCT가 지금 내 필요를 충족시킬 수 있다고 생각합니다. – eek142

0

where exists() 절은 데카르트 제품

당신의 WHERE 절에
FROM left_table lt 
where exists(
    select 1 from right_table 
    where lt.[timestamp] BETWEEN [timestamp] - .00015 AND [timestamp] + .00015 
    and lt.name=name 
    AND ........ 
) 
AND ........ 
관련 문제