2013-05-08 1 views
0

나는이 스크립트를 한동안 사용해 왔으며 막 다른 골목에 다다 랐다. 스크립트는 작동하지만 불행하게도 중복을 생성합니다. 내 스크립트는 state_issue_teacher_id 키의 데이터베이스에서 두 개의 다른 테이블을 조인 한 다음 출력을 생성합니다. 두 테이블을 모두 확인하고 행 수는 동일하며 조인은 레코드와 완벽하게 일치해야하지만 분명히 내 키 또는 테이블에 가입하는 방식에 문제가있어 출력이 부분적으로 올바르지 않게 되돌아옵니다. 또한 고유 한 키를 만들고 테이블을 조인하지만 여전히 잘못된 결과를 생성하는 특성을 연결하려고했습니다.데이터베이스에서 테이블에 중복 행을 제거하는 방법은 무엇입니까?

SELECT  
     LTRIM(RTRIM(rt.year_time)) AS 'year_time' , 
     LTRIM(RTRIM(rt.state_issue_teacher_id)) AS state_issue_teacher_id , 
     LTRIM(RTRIM(rt.district_code)) AS district_code , 
     rt.district_name , 
     rt.school_name , 
     LTRIM(RTRIM(rt.assignment_code)) AS assignment_code , 
     rt.assignment_desc , 
     LTRIM(RTRIM(rt.position_code)) AS position_code , 
     rt.position_desc , 
     LTRIM(RTRIM(rt.last_name)) AS last_name , 
     LTRIM(RTRIM(rt.first_name)) AS first_name , 
     LTRIM(RTRIM(rt.total_salary)) AS total_salary , 
     rt.assign_fte , 
     LTRIM(RTRIM(rt.school_code)) AS school_code , 
     rt.fte 

    FROM staging.dbo.rt AS rt 

    LEFT JOIN (SELECT LTRIM(RTRIM(dti.year)) AS year , 
        LTRIM(RTRIM(dt.teacher_id)) AS teacher_id , 
        LTRIM(RTRIM(db.district_code)) AS district_code , 
        db.district_name , 
        LTRIM(RTRIM(dt.last_name)) AS last_name , 
        LTRIM(RTRIM(dt.first_name)) AS first_name , 
        LTRIM(RTRIM(da.assignment_code)) AS assignment_code , 
        LTRIM(RTRIM(dp.position_code)) AS position_code , 
        dre.race_ethnicity_code , 
        LTRIM(RTRIM(SUBSTRING(db.school_code,10,4))) AS school_code , 
        da.assignment_desc , 
        dp.position_desc , 
        fs.total_fte 

      FROM  mart.dbo.fact_s AS fs 
        LEFT OUTER JOIN mart.dbo.fact_s.dbo.dim_building 
        AS db ON fs.building_key = db.building_key 
        LEFT OUTER JOIN mart.dbo.fact_s.dbo.dim_teacher 
        AS dt ON fs.teacher_key = dt.teacher_key 
        LEFT OUTER JOIN mart.dbo.fact_s.dbo.dim_assignment 
        AS da ON fs.assignment_key = da.assignment_key 
        LEFT OUTER JOIN mart.dbo.fact_s.dbo.dim_race_ethnicity 
        AS dre ON dt.race_ethnicity_key = dre.race_ethnicity_key 
        LEFT OUTER JOIN mart.dbo.fact_s.dbo.dim_gender 
        AS dg ON dt.gender_key = dg.gender_key 
        LEFT OUTER JOIN mart.dbo.fact_s.dbo.dim_time 
        AS dti ON fs.time_key = dti.time_key 
        LEFT OUTER JOIN mart.dbo.fact_s.dbo.dim_position 
        AS dp ON fs.position_key = dp.position_key 
      WHERE dti.year = '2012' 



     ) raw ON rt.state_issue_teacher_id = raw.teacher_id     
         AND rt.year_time = raw.year 
         AND rt.last_name = raw.last_name 
         AND rt.first_name = raw.first_name 
         AND rt.district_code = raw.district_code 
         AND rt.position_code = raw.position_code 
         AND rt.school_code = RAW.school_code 
         AND rt.assignment_code = raw.assignment_code 



    WHERE rt.year_time = '2012' 



    ORDER BY rt.last_name, rt.first_name 

내가 갖는 출력은 다음과 같습니다 : enter image description here

결합 된 교사 배정에 대한 FTE이 같은이 그 1. 그러나 교사를 추가해야 다음

내 스크립트입니다 여러 개의 부분 할당이있는 assignment_code/desc가 중복을 생성합니다. 예 : Jane Doe는 2 회가 아닌 총 fte가 4 회 나타 났으며 올바른 총합은 1.0입니다. 출력은 다음과 같이 읽어야합니다. enter image description here

+0

그래서 당신은 같은 것이, RT AS staging.dbo.rt로부터 "관심의 모든 열을"SELECT FS AS mart.dbo.fact_s하지 않으 WHERE rt.state_issue_teacher_id = fs.teacher_id 및 rt.year_time의 =의 FS .year 및 rt.year_time = '2012'; – Clark

+0

두 테이블의 기본 키는 무엇입니까? 동일한 행 수로 인해 결과 조인의 행 수가 동일하지는 않습니다. – Andreas

+0

Pk가 state_issue_teacher_id – Tone

답변

1

과제의 모든 설명이 동일하고 복수 과제가있는 시간제 교사의 경우 중복되는 것으로 보입니다. 이것은 실제 출력의 처음 네 행과 원하는 출력의 처음 두 행에서 명확합니다.

필자는 왜 그러한 복제본을 시작해야하는지 궁금합니다. 그러나 그들은 사실 테이블에 있으므로 중요한 어떤 것이 있어야합니다 (두 시간제지도 카운슬러가 전임으로서가 아닌 한 번에 자금을 지원 받았다고 가정). 이 경우 사실 테이블에 실제로 중복 레코드가 있습니까? 그렇지 않은 경우 중복되지 않은 필드는 문제를 해결할 추가 조인 키를 제안 할 수 있습니다.

rt.assignment_code = raw.assignment_code이 조인 조건으로 생성 된 카디 전 곱을 제거해야합니다.

더 나은 가입 키를 찾는 것 외에도이 문제를 해결할 수있는 두 가지 방법을 생각해 볼 수 있습니다. 첫 번째는 직책에 대한 고유 한 ID를 작성하는 것입니다. 아마도 귀하의 데이터 구조에서 당신은 하나를 알고 있습니다. 또는 row_number()을 사용하여 여러 순위의 사람들에게 일련 번호를 추가 할 수 있습니다.

다른 방법은 한 쪽 또는 다른 쪽에서 중복을 제거하는 것입니다. 예를 들어 rt을 집계하여 이러한 중복을 제거 할 수 있습니다.

+0

고든입니다. 이러한 중복은 사실 또는 준비 테이블에 존재하지 않으므로 마트와 팩트 모두 올바른 결과를 얻습니다 여러 과제. 두 테이블 중 더 나은 고유 조인 키가 없습니다. 이것은 전체 데이터 유효성 검사 프로세스의 일부이며 원본 소스 파일을 조작하지 않으려 고합니다. 추가 조인 키를 위해 여러 속성을 연결하려고 시도했지만 동일한 중복 오류가 발생했습니다. – Tone

+0

@ 톤. . . 할당 설명이 동일 할 때 데카르트 제품을 얻는 것을 볼 수는 있지만 다르다면 그렇지 않습니다.가장 쉬운 설명은이 행이 양면에 중복되고 할당 코드로 결합되며 명시 적 키 또는 암시 적 키 중 하나입니다 (데이터베이스가 동일한 여러 배정을 갖는 한 사람을 고려하지 않고 설계 되었기 때문에 가능)). –