2011-04-26 6 views
0

1 개의 메인 연락처 ("메인")라는 테이블과 여러 개의 다른 테이블이 있습니다. 그들 모두에는 Contacts_ID (또는 referral_ID)라는 이름의 열이 있습니다. 이 모든 설정 방식의 문제는 "Main"의 레코드가 참조 테이블의 둘 이상의 레코드에 링크 될 수 있기 때문에 쿼리를 실행 한 후 중복 레코드를 가져 와서 "Contact_Source"열에있는 연락처를 가져옵니다. 추천 표필터 계층 구조별로 레코드가 중복됩니까?

웹 사이트에서 쿼리를 실행할 때 선택할 수있는 뷰를 만들었으므로 적절한 데이터를 적절한 상황으로 가져옵니다. 나는 그들의 "접촉 근원"에 의해이 질문을 또한 달린다. 중복 된 기록을 유지하기 위해 이전에 두 가지 질문 (herehere)을 게시했습니다. 나는 일하고있다. 여기

내가 점점 중복 레코드에서 저를 계속 가지고 최종 코드 :

ALTER VIEW dbo.v_angelview AS 

WITH q AS 
     (
     SELECT dbo.[1_MAIN - Contacts].Contact_ID, dbo.[1_MAIN - Contacts].Date_entered_into_Database, dbo.[1_MAIN - Contacts].Date_of_Initial_Contact, 
         dbo.[1_MAIN - Contacts].[Company_ Name], dbo.[1_MAIN - Contacts].Key_Contact_Title, dbo.[1_MAIN - Contacts].Key_Contact_First_Name, 
         dbo.[1_MAIN - Contacts].Key_Contact_Middle, dbo.[1_MAIN - Contacts].Key_Contact_Last_Name, dbo.[1_MAIN - Contacts].Key_Credential, 
         dbo.[1_MAIN - Contacts].Key_Contact_Occupation, dbo.[1_MAIN - Contacts].Key_Degree_1, dbo.[1_MAIN - Contacts].Key_Degree_2, 
         dbo.[1_MAIN - Contacts].Key_Degree_3, dbo.[1_MAIN - Contacts].Date_of_Highest_Degree, dbo.[1_MAIN - Contacts].Work_Setting, 
         dbo.[1_MAIN - Contacts].Website_Address, dbo.[1_MAIN - Contacts].Email_1_Key_Contact, dbo.[1_MAIN - Contacts].Email_2, 
         dbo.[1_MAIN - Contacts].Email_3, dbo.[1_MAIN - Contacts].Day_Time_Phone_Number, dbo.[1_MAIN - Contacts].Extension, 
         dbo.[1_MAIN - Contacts].Mobile_Phone_Number, dbo.[1_MAIN - Contacts].Bus_Fax_Number, dbo.[1_MAIN - Contacts].Home_Phone_Number, 
         dbo.[1_MAIN - Contacts].Home_Fax_Number, dbo.[1_MAIN - Contacts].Mailing_Street_1, dbo.[1_MAIN - Contacts].Mailing_Street_2, 
         dbo.[1_MAIN - Contacts].Mailing_City, dbo.[1_MAIN - Contacts].Mailing_State, dbo.[1_MAIN - Contacts].[Mailing_Zip/Postal], 
         dbo.[1_MAIN - Contacts].Mailing_Country, dbo.[1_MAIN - Contacts].[Bad_Address?], dbo.[1_MAIN - Contacts].[PROV/REG?], 
         dbo.[1_MAIN - Contacts].status_flag, dbo.[1_MAIN - Contacts].status_flag AS status_flag2, dbo.Providers.Referral_Source, dbo.Referral.Contact_Source, 
         dbo.Resource_Center.cert_start_date, dbo.Resource_Center.cert_exp_date, dbo.prov_training_records.Contact_ID AS Expr2, 
         dbo.prov_training_records.date_reg_email_sent, dbo.Resource_Center.access, dbo.Providers.Contact_ID AS Expr1, 
       ROW_NUMBER() OVER (PARTITION BY dbo.[1_MAIN - Contacts].Contact_ID ORDER BY dbo.[1_MAIN - Contacts].Contact_ID) AS rn 
     FROM dbo.[1_MAIN - Contacts] 
     INNER JOIN 
       dbo.Referral 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Referral.Referral_ID 
     INNER JOIN 
       dbo.prov_training_records 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.prov_training_records.Contact_ID 
     LEFT OUTER JOIN 
       dbo.Resource_Center 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Resource_Center.Contact_ID 
     FULL OUTER JOIN 
       dbo.Providers 
     ON  dbo.[1_MAIN - Contacts].Contact_ID = dbo.Providers.Contact_ID 
WHERE (dbo.[1_MAIN - Contacts].Mailing_State = N'AL') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'FL') OR 

         (dbo.[1_MAIN - Contacts].Mailing_State = N'GA') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'KY') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'MS') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'NC') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'SC') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'TN') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'PR') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'CO') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'MT') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'ND') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'SD') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'UT') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'WY') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'AR') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'LA') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'NM') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'OK') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'TX') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'AZ') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'CA') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'HI') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'ID') OR 
         (dbo.[1_MAIN - Contacts].Mailing_State = N'NV') 
     ) 
SELECT * 
FROM q 
WHERE rn = 1 

지금 직면하고있는 문제는 내가 계속 중복 된 레코드를의 우선 순위를 설정해야한다는 것입니다 어느 것을 얻을 제거되었습니다.

  1. Contact_Source = 'PROVIDER'
  2. Contact_Source LIKE 'RG_ %의'
  3. Contact_Source LIKE 'IN_ %의'
  4. Contact_Source 같은

    가장 선행 시작하여 우선 순위의 계층 구조 'LD_ %'

레코드 중 하나 또는 모두에 레코드를 연결할 수 있습니다. 예를 들어 레코드에 PROVIDER 및 RG_Train이 있으면 PROVIDER로 레코드를 유지하려고합니다. 목록에서 아래로. 다시 말하지만, 모든 레코드에는 Contact_ID가 있습니다. 즉, 중복이 있음을 알 수 있습니다.

이렇게하려면 기존 SQL을 수정하는 방법이 있습니까? 그렇지 않으면 새로운 방법이 필요합니까? 그렇다면 우선 순위 목록에 따라 중복 레코드를 제거하려면 어떻게해야합니까?

SQL Server 2005를 사용하고 있습니다.

미리 감사드립니다!

답변

1

시도 ...

rn = ROW_NUMBER() 
OVER 
(
    PARTITION BY dbo.[1_MAIN - Contacts].Contact_ID 
    ORDER BY 
    CASE 
    WHEN Contact_Source = 'PROVIDER' 
    THEN 1 

    WHEN Contact_Source LIKE 'RG_%' 
    THEN 2 

    WHEN Contact_Source LIKE 'IN_%' 
    THEN 3 

    WHEN Contact_Source LIKE 'LD_%' 
    THEN 4 

    ELSE 5 
    END 
) 
+0

이 좋은 작품, 감사합니다! – UpHelix

0

이는 ROW_NUMBER 함수의 사용을 이용하지 않는,하지만 난이 일을 할 생각 :

with q as (
    -- <query> 
), 
cp as (
    select 1 as Precedence, 'PROVIDER' ContactSourcePattern 
    union all select 2, 'RG_%' 
    union all select 3, 'IN_%' 
    union all select 4, 'LD_%' 
) 
select q.* 
from q 
inner join cp on q.Contact_Source like cp.ContactSourcePattern 
where 
    -- filter out duplicate records with the same `Contact_ID` that have a lower precedence than other records 
    not exists (
     select 1 
     from q as q2 inner join cp as cp2 on q2.Contact_Source like cp2.ContactSourcePattern 
     where 
      q2.Contact_ID = q.Contact_ID -- q2 is a duplicate of q if `Contact_ID` matches 
      and cp2.Precedence < cp.Precedence -- q2/cp2 is higher precedence than q/cp if `Precedence` is a smaller number 
    ) 
관련 문제