2010-06-12 8 views
3

SQL 조인을 사용할 때 왼쪽 테이블에 대해 단일 행을 가진 행만 유지할 수 있습니까? 예를 들어SQL에서 필터 중복

:

select * from A, B where A.id = B.a_id; 

a1 b1 
a2 b1 
a2 b2 

이 경우, 나는 첫 번째 행을 제외하고 모두 제거 할 어디 MySQL을 사용하고있어 B.

에서 일치 정확히 1 행의 단일 행

.

답변

4

이 MySQL의에서 작동합니다 :

select * from A, B where A.id = B.a_id GROUP BY A.id HAVING COUNT(*) = 1; 

을 MySQL을 사용하지 당신을 위해, 당신은 A.를 제외하고 (모든 컬럼에 (MIN() 또는 MAX()와 같은) 집계 함수를 사용해야합니다 id) 데이터베이스 엔진이 불평하지 않도록하십시오.

+0

B에 일치하는 행이 두 개 이상있는 경우 제대로 작동하지 않습니다. HAVING 절을 제거해야합니다. (비록 GROUP이 아닌 모든 열에 항상 집계 함수를 사용하는 것이 좋지만) 괜찮을 것입니다. – sqlvogel

+0

사과. 나는 원한 것을 잘못 읽은 것 같다. 귀하의 질의가 좋고 광산이 아닌 것 같아요.하지만 도움이 될 경우에 대비해서 제 일을 도와 드리겠습니다. :) – sqlvogel

0

이와 같은 질문을 할 때 테이블의 키를 지정하면 도움이됩니다. 당신의 예에서 B의 열쇠가 무엇인지는 분명하지 않습니다 (그것이 있다고 가정 할 때).

여기에 ID를 가정 가능한 용액

SELECT * 
FROM A, B 
WHERE B.id = 
(SELECT MIN(B.id) 
    FROM B 
    WHERE A.id = B.a_id); 
0

먼저 나타난 B.의 후보 키 I는 JOIN 구문 대신 쉼표 테이블을 분리 오래된 구문을 사용하여 추천 할 것 인이다. A.id 테이블 A의 기본 키 인 경우 둘째, 당신은 단지 중복 테이블 B을 검사 필요 :

Select ... 
From A 
    Join B 
     On B.a_id = A.id 
Where Exists (
       Select 1 
       From B B2 
       Where B2.a_id = A.id 
       Having Count(*) = 1 
       ) 
0

이 큰 테이블에 대한 비용이 많이들 수 있습니다 일치하는 행을 계산의 비용을 방지 할 수 있습니다.

가능한 다양한 솔루션을 비교할 때 실행 계획을 벤치마킹/비교하는 것이 좋습니다.

select 
    * 
from 
    A 
    join B on A.id = B.a_id 
where 
    not exists (
    select 
     1 
    from 
     B B2 
    where 
     A.id = b2.a_id 
     and b2.id != b.id 
)