SQL 조인을 사용할 때 왼쪽 테이블에 대해 단일 행을 가진 행만 유지할 수 있습니까? 예를 들어SQL에서 필터 중복
:
select * from A, B where A.id = B.a_id;
a1 b1
a2 b1
a2 b2
이 경우, 나는 첫 번째 행을 제외하고 모두 제거 할 어디 MySQL을 사용하고있어 B.
에서 일치 정확히 1 행의 단일 행.
SQL 조인을 사용할 때 왼쪽 테이블에 대해 단일 행을 가진 행만 유지할 수 있습니까? 예를 들어SQL에서 필터 중복
:
select * from A, B where A.id = B.a_id;
a1 b1
a2 b1
a2 b2
이 경우, 나는 첫 번째 행을 제외하고 모두 제거 할 어디 MySQL을 사용하고있어 B.
에서 일치 정확히 1 행의 단일 행.
이 MySQL의에서 작동합니다 :
select * from A, B where A.id = B.a_id GROUP BY A.id HAVING COUNT(*) = 1;
을 MySQL을 사용하지 당신을 위해, 당신은 A.를 제외하고 (모든 컬럼에 (MIN() 또는 MAX()와 같은) 집계 함수를 사용해야합니다 id) 데이터베이스 엔진이 불평하지 않도록하십시오.
이와 같은 질문을 할 때 테이블의 키를 지정하면 도움이됩니다. 당신의 예에서 B의 열쇠가 무엇인지는 분명하지 않습니다 (그것이 있다고 가정 할 때).
여기에 ID를 가정 가능한 용액
SELECT *
FROM A, B
WHERE B.id =
(SELECT MIN(B.id)
FROM B
WHERE A.id = B.a_id);
먼저 나타난 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
)
이 큰 테이블에 대한 비용이 많이들 수 있습니다 일치하는 행을 계산의 비용을 방지 할 수 있습니다.
가능한 다양한 솔루션을 비교할 때 실행 계획을 벤치마킹/비교하는 것이 좋습니다.
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
)
B에 일치하는 행이 두 개 이상있는 경우 제대로 작동하지 않습니다. HAVING 절을 제거해야합니다. (비록 GROUP이 아닌 모든 열에 항상 집계 함수를 사용하는 것이 좋지만) 괜찮을 것입니다. – sqlvogel
사과. 나는 원한 것을 잘못 읽은 것 같다. 귀하의 질의가 좋고 광산이 아닌 것 같아요.하지만 도움이 될 경우에 대비해서 제 일을 도와 드리겠습니다. :) – sqlvogel