2017-05-24 83 views
1

我一直試圖在SQL Server中一起使用連接字段作爲我的唯一標識符連接三個表,但我注意到它已經返回了重複的記錄。如何處理SQL Server連接中的重複記錄?

  • 表A具有25'003記錄
  • 表B具有29'387記錄
  • 表C具有22'938記錄

目標是加入B和C到A.

結果共有48'732條記錄。

這裏是我的查詢的一個片段:

Select 
    a.xxxx, a.yyyy, b.sdsd, c.dffgg 
From 
    [table A] a 
Left Join 
    [table B] b on a.pkey = b.pkey 
Left Join 
    [table C] c on a.pkey = c.pkey. 

表A:

PeriodRef OfficeCode OfficeDesc TaskServLineCode TaskServLineDesc ServLineDiv PartnerCode PartnerName ManagerCode ManagerName BillerCode BillerName ClientCode ClientName BusCatCode BusCatDesc GroupCode GroupDesc TaskCode TaskDesc TaskDateOpen TaskDateTerminate InvNumber InvDate LTDInv LTDFee LTDVat LTDCn LTDRec LTDPLFC YTDInv YTDFee YTDVat YTDCn YTDRec YTDPLFC PTDInv PTDFee PTDVat PTDCn PTDRec PTDPLFC CBal BalCurr Bal30 Bal60 Bal90 Bal120 Bal150 Bal180 CM Provision PM Provision CM Provision movement Start CY Provision YTD Provision movement 
201710 1 LAGOS A100 e a AAA xcv rg vgg AOA iyh erd2 tggtt yue jd kdk weeer INV Invoice NULL NULL 5yj 00:00.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
201710 1 LAGOS A100 e a AAA cbvc rfgt ghh ZZZZZ ssf 34ef etg assw kjkl kdk jdkjf INV Invoice NULL NULL 6uuj 00:00.0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
201710 1 LAGOS A100 e a AAA zcvv ffbb ddg EOK adf 23df sss asd ieel kdk dghjg;js CT07 sff 00:00.0 00:00.0 56 00:00.0 0 4837500 237500 0 5075000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

表B和C具有相同的架構。他們唯一的區別就是這個時期。

PS:這些表沒有唯一的標識符,這就是爲什麼我連接了一些列以獲取標識符的原因。謝謝大家。

+0

pkey不是唯一的...... – Backs

+0

如果您包含模式和樣本數據以測試 –

+3

,它將有所幫助關於我們可以告訴您的是,表b和/或c中顯然存在多行加入標準。 –

回答

0

這是一個有點模糊的問題,「你如何處理重複記錄加入?」,所以這裏是一個非常通用的答案(這可能是你在找什麼,也可能讓你開始):

WITH UniqueKeys AS (
    SELECT DISTINCT pkey FROM [table A] 
    UNION 
    SELECT DISTINCT pkey FROM [table B] 
    UNION 
    SELECT DISTINCT pkey FROM [table C]) 
SELECT 
    u.pkey, 
    CASE WHEN a.pkey IS NOT NULL THEN 1 ELSE 0 END AS in_a, 
    CASE WHEN b.pkey IS NOT NULL THEN 1 ELSE 0 END AS in_b, 
    CASE WHEN c.pkey IS NOT NULL THEN 1 ELSE 0 END AS in_c 
FROM 
    UniqueKeys u 
    LEFT JOIN [table A] a ON a.pkey = u.pkey 
    LEFT JOIN [table B] a ON b.pkey = u.pkey 
    LEFT JOIN [table C] a ON c.pkey = u.pkey; 

這是我當我處理的,可能有重複或「失蹤」在多個表的鍵數據的基本方法:

  • 做出確實存在鍵的主列表,在所有三個表。這裏的關鍵是我使用UNION,因此刪除了任何重複項;
  • 將此用作我的定位點,以便將LEFT JOIN添加到每個表中。

這會給我一個列表,顯示每個鍵是否存在於表a,b或c中。

我想你想擴大這個,例如你可以添加一個約束條件,只有當源表中有重複項時纔會列出這些關鍵字?

如果確實存在重複,例如pkey「XYZ123」在表A中存在四次,那麼您可能需要將基本查詢更改爲GROUP BY u.pkey,並將CASE語句的MAX()值?你甚至可以通過使用SUM()來計算實例的數量,但是你需要避免「將結果乘以」。

所以您的查詢現在看起來是這樣的:

WITH UniqueKeys AS (
    SELECT DISTINCT pkey FROM [table A] 
    UNION 
    SELECT DISTINCT pkey FROM [table B] 
    UNION 
    SELECT DISTINCT pkey FROM [table C]) 
SELECT 
    u.pkey, 
    SUM(CASE WHEN a.pkey IS NOT NULL THEN a.instances ELSE 0 END) AS in_a, 
    SUM(CASE WHEN b.pkey IS NOT NULL THEN b.instances ELSE 0 END) AS in_b, 
    SUM(CASE WHEN c.pkey IS NOT NULL THEN c.instances ELSE 0 END) AS in_c 
FROM 
    UniqueKeys u 
    LEFT JOIN (SELECT COUNT(*) AS instances FROM [table A] WHERE pkey = u.pkey) a ON a.pkey = u.pkey 
    LEFT JOIN (SELECT COUNT(*) AS instances FROM [table B] WHERE pkey = u.pkey) b ON b.pkey = u.pkey 
    LEFT JOIN (SELECT COUNT(*) AS instances FROM [table C] WHERE pkey = u.pkey) c ON c.pkey = u.pkey 
GROUP BY 
    u.pkey; 
0

問題並不清楚。看看這是否有助於你。 無論你如何生成你的標識符,如果它具有超過一個對應的鍵,那麼它將返回重複。

請檢查3個表的計數。

select count(pkey) from [table A] 
select count(distinct pkey) from [table A] 
select count(pkey) from [table B] 
select count(distinct pkey) from [table B] 
select count(pkey) from [table C] 
select count(distinct pkey) from [table C] 

如果從表B和表C值的數量和重複計數不同,則意味着鑰匙表B和表C.被複制所以你的加入總是返回多行,當你用表匹配A.