2017-10-06 3 views
0

Je rejoins une table principale de compte avec des lignes d'environ 4MM avec une table de transactions. Mon problème est que lorsque je fais une jointure gauche du numéro de compte de la table de transaction = numéro de compte de la table principale du compte, je découvre une anomalie dans nos données. Je peux avoir 3 entrées différentes dans le compte principal pour le même numéro de compte. Ceux-ci se rapportent aux caractéristiques du compte. L'anomalie est que, bien que l'information sur l'adresse puisse être la même, dans certains cas, je vois que l'orthographe de la ville est différente. Lorsque je rejoins les deux tables, je ne souhaite que la première instance du numéro de compte dans le compte principal. J'ai vu quelques messages sur l'utilisation de row_number() mais je suis perdu à l'utiliser correctement ici. C'est ce que j'utilise mais obtenir trois enregistrements pour chacun des numéros de compte.Joindre à gauche avec le tableau de droite 1 valeurs

 select am.[Customer_Name], am.[svc_city], sr.measure 
from [dbo].[PP_SUMMARY_RESIDENTIAL] sr 
left join [CIS].[dbo].[Account_Master] am on 
(case when (left(sr.fred_account_number,2) = '00') then (right(sr.fred_account_number,len(sr.fred_account_number - 2))) 
    when (left(sr.fred_account_number,1) = '0') then (right(sr.fred_account_number,len(sr.fred_account_number - 1))) 
    else sr.fred_account_number 
    end) 
= (select am.accountnumber, row_number() over (order by am.accountnumber) as row) where row = 1 
and sr.fred_account_number = '123456789' 
+0

Voici un bon point de départ. http://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

Répondre

0

D'abord, s'il y a plusieurs enregistrements pour le même compte alors le schéma DB et/ou les applications qui l'utilisent sont dans le besoin d'être rénovées.

Quoi qu'il en soit, pour sélectionner un seul enregistrement de plusieurs « analogues » vous pouvez faire quelque chose le long des lignes de (simplifiée de votre requête)

with 
acc_with_ord as ( 
    select 
     col1, col2,..., 
     row_number() over (partition by <uniquely identifying columns> order by <some columns>) as ord 
    from 
     AccountMaster 
), 
unq_acc as (
    select * from acc_with_ord where ord = 1 

) 
select <something> 
from 
    pp_summary_residential 
    left join unq_acc on 
     <join conditions> 

La première partie attribue ids de commande de substitution aux enregistrements décrivant la même compte (puisque nous partitionnons par certains champs qui identifient de façon unique le compte), le second sélectionne un seul enregistrement par compte, et le troisième est le dernier choix qui utilise les enregistrements de compte uniques dans la jointure.

0

Je suggère d'utiliser outer apply:

select am.[Customer_Name], am.[svc_city], sr.measure 
from [dbo].[PP_SUMMARY_RESIDENTIAL] sr outer apply 
    (select top 1 am.* 
     from [CIS].[dbo].[Account_Master] am 
     where (case when (left(sr.fred_account_number, 2) = '00') then (right(sr.fred_account_number,len(sr.fred_account_number - 2))) 
        when (left(sr.fred_account_number,1) = '0') then (right(sr.fred_account_number, len(sr.fred_account_number - 1))) 
        else sr.fred_account_number 
      end) 
     order by am.account_number 
    ) am; 

Cela permet de sélectionner une ligne de am, dont l'un dépend de la order by.