2016-06-26 3 views
0

쿼리 제거 할 방법 : 여기내가 중복 레코드

Select table_c.id_number, table_c.name, table_s.site_name,table_co.Contract_name 
FROM table_c , table_s, table_m, table_o, table_a, table_con 
    WHERE 
    table_s.objid = table_c.sobjid 
    AND table_m.cobjid (+) = table_c.objid 
    AND table_o.objid (+) = table_m.olobjid 
    AND table_a.objid (+) = table_o.aobjid 
    AND table_co.objid (+) = table_a.conobjid; 

내가 6 개 테이블이 있습니다. table_c와 table_s에는 하나의 2 가지 관계가 있습니다. 그것은 가능한 1 table_o 레코드에 대해 우리는 2 table_c 레코드를 가질 수 있습니다 또는 레코드가 될 수 있습니다. 내가 table_c 및 table_s 테이블과 함께 SELECT에서 table_co 값을 가져 가야하기 때문에, 나는 모든 테이블에 조인을 사용했습니다 table_c-> table_m- > table_o-> table_a-> table_co.

이제이 쿼리를 실행하면 중복 레코드가 생깁니다. table_c에 수백만 개의 레코드가 있습니다. 따라서 중복 레코드를 제거하기 위해 distinct 또는 Union ALL을 사용하면 쿼리가 매우 오랜 시간이 걸릴 수 있습니다.

성능 문제없이 고유 한 레코드를 제공하는 방식으로이 쿼리를 올바르게 처리 할 수 ​​있습니까?

이 쿼리는 외부 시스템에서 데이터를 가져 오기 위해 사용하는 sql 뷰의 일부입니다.

미리 감사드립니다.

+1

명시 적 조인 구문을 사용하여 쿼리를 다시 작성하십시오. –

+0

팀 가입 구문에 동의하면 관계가 명확하지 않아 문제를 쉽게 해결할 수 있습니다. http://www.w3schools.com/sql/sql_join_inner.asp는 newr 개념 인 경우 내부 결합에 관한 기사입니다. 지금 당장 볼 수있는 한 가지 문제는 다른 테이블에 대해 table_s에 대해 정의 된 관계가 없다는 것입니다. 이는 크로스 조인을 생성하고 아마도 성능에 따른 고유 그룹 또는 그룹이 왜 불량한지를 보여주는 많은 수의 중복을 반환한다는 것을 의미합니다. – Matt

+0

안녕하세요 @ Matt/@ Tim, 나는 또한 명시 적 조인 (내부/왼쪽 외부 조인)을 사용하고 쿼리를 다시 작성하라는 제안에 동의합니다. 또 다른 요점은 table_s가 table_c와 one2one 관계가 있고 table_c가이 쿼리의 주요 테이블이기 때문에 table_s가 중복 레코드의 이유라고 생각하지 않습니다. 감사합니다 - – HelloFriends

답변

1

ROW_NUMBER()를 사용해보십시오 :

SELECT * FROM (
    Select table_c.id_number, table_c.name, table_s.site_name,table_co.Contract_name , 
      ROW_NUMBER() OVER(PARTITION BY table_c.id_number,table_c.name ORDER BY 1) as rnk 
    FROM table_c 
    INNER JOIN table_s ON(table_s.objid = table_c.sobjid) 
    LEFT OUTER JOIN table_m ON(table_m.cobjid = table_c.objid) 
    LEFT OUTER JOIN table_o ON(table_o.objid = table_m.olobjid) 
    LEFT OUTER JOIN table_a ON(table_a.objid = table_o.aobjid) 
    LEFT OUTER JOIN table_con ON(table_co.objid = table_a.conobjid)) 
WHERE rnk = 1; 

참고 : 가입 암시 적 구문의 사용을 (쉼표로 구분) 방지하고 조인의 적절한 구문을 사용하십시오.

나는 PARTITION BY table_c.id_number,table_c.name을 사용했으며 모든 열을 추가하면 '고유'행이 지정됩니다.

+0

레거시 조인 구문이 잘못되었습니다 - 그냥 혼란 스러워요. – MT0

+0

잘못된 단어를 선택했을 수도 있습니다. 그 의미가 아닙니다. 나는 적절하다고 생각합니다. @ MT0 – sagi

+0

안녕하세요 @ 사기, 당신의 해결책을 시도했고 결과는 다음과 같습니다. 1) 필터 조건 (예 : table_c.id_number = '12345')을 제공하면 중복 기록이 남지 않습니다. 2) 필터를 적용하지 않으면 쿼리가 초기 레코드 세트를 제공하는 데 너무 많은 시간이 걸립니다. 그래서 저는 여전히 성능 문제가 있다고 생각합니다. 감사합니다 – HelloFriends