2011-03-03 5 views
0

미국 내 항공사 노선의 경쟁력을 비교 한 표가 있습니다. 따라서 표의 일부 필드는 id, route_id1, route_id2, airline_id1, airline_id2, sources_airport_id 및 destination_airport_id입니다. 이 테이블은 경로 맵으로 구성된 routes 테이블을 자체 조인 한 결과입니다. 그러나 결과적으로 테이블에는 다소 중복 된 레코드가 있습니다.MySQL을 사용하는 테이블에서 중복 레코드 제거

예를 들어,
route1은 route2와 경쟁적입니다. source2airport와 destination_airport는 같지만 airline_id가 다르기 때문입니다. 그러나 route1과 route2를 비교하고 route2를 route1과 비교하는 두 개의 레코드가 있습니다. 그들은 같은 비교지만, 그냥 다르게 주문했다.

I 자기 결합하여 중복 페치하려고했습니다.
SELECT T1 * T1 AS 경로로부터, T2 AS 노선 WHERE t1.route_id1 = t2.route_id2 AND t1.route_id2 = t2.route_id1
그러나이 쿼리는 테이블에서 같은 수의 레코드를 가져옵니다.

"중복"데이터를 제거하려면 어떻게합니까?

미리 감사드립니다.

답변

1

t1t2을 분리 할 조건이 없다는 것이 문제입니다. 먼저 t1t2이 바뀌면 복제본을 받게됩니다. 두 번째로, 행에 route_id1 = route_id2이있는 경우 결과 집합의 t1t2에 해당 행이 표시됩니다.

가장 간단한 방법은 것이 둘러 보는 :

SELECT t1.* FROM routes AS t1, routes AS t2 
WHERE t1.route_id1 = t2.route_id2 AND t1.route_id2 = t2.route_id1 
     AND t2.id > t1.id 

추가 된 기준은 하나 개의 행이 다른 것보다 더 큰 ID를 가지고 있어야한다는 것입니다. 즉, 반환 된 t1은 항상 더 낮은 ID를 가진 행입니다. 당연히 <으로 바꾸거나 매개 변수를 바꾸어 위 ID로 행을 가져올 수 있습니다.

이렇게하면 대부분의 중복을 제거 할 수 있습니다. 데이터베이스에 적절한 중복이있는 경우 위 쿼리의 결과 집합에 일부 중복 행이 만들어집니다. 그 이유는 "복제본"이 서로 다른 두 행의 "복제본"으로 감지 될 수 있으며, 실제로는 서로 복제됩니다.

0

은 필드의 실제 이름을 사용하고 t1. * 대신 DISTINCT 절을 사용합니다. 필드 목록에 을 입력하면 airline_id를 다른 것으로 포함하지 않도록하고 기록이 중복되지 않도록합니다.

0

"SELECT DISTINCT t1.* FROM ..."을 사용해 보셨습니까?