左连接右表1的值

时间:2017-10-06 16:03:55

标签: sql sql-server join

我正在加入一个帐户主表,其中大约有4MM行和一个事务表。我的问题是,当我从帐户主表中的事务表=帐号进行帐号的左连接时,我发现数据中存在异常。对于相同的帐号,我可以在帐户主数据库中有3个不同的条目。这些与帐户的特征有关。异常是,虽然地址信息可能相同,但在某些情况下,我看到城市的拼写不同。当我加入这两个表时,我只想要帐户主数据中的第一个帐号。我看过一些关于使用row_number()的帖子,但我在这里正确使用它时迷失了方向。这是我正在使用的,但为每个帐号获取三个记录。

     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' 

2 个答案:

答案 0 :(得分:0)

首先,如果同一帐户有多条记录,那么数据库架构和/或使用它的应用程序需要翻新。

无论如何,要只选择一个“类似”的记录,你可以做一些事情(从你的查询中简化)

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>

第一部分将代理订单ID分配给描述同一帐户的记录(因为我们按照一些唯一标识帐户的字段进行分区),第二部分只为每个帐户选择一条记录,第三部分是最终选择使用联接中的唯一帐户记录。

答案 1 :(得分:0)

我建议使用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;

这将从am中选择一行,其中一行取决于order by