首页 > 解决方案 > SAS左连接获得的记录多于第一个表中的记录

问题描述

table a 
x    y               z
123  london          Data engineer
345  United states   Software engineer
678  South africa    Electrical engineer

Table b
X    U
123  David
345  Mike
910  Mark
678  Steve
121  Kyle

Output
X    Y              Z                   U
123  London         Data engineer       David
345  United states  Software engineer   Mike
678  South Africa   Electrical engineer Steve

当我使用 proc SQL left join 时,我得到了超过 3 条记录。请你帮助我好吗

处理 SQL;

create table x as 
select 
      a.*,
      b.u 
   from 
      table a 
         left join table b 
            on a.x = b.x; 
quit; 

标签: sqlsasproc

解决方案


如果 aleft join返回的记录多于原始表中的记录,则您在右侧表或查询中有连接变量的重复值。

解决这个问题的常用方法是:

  • 如果右侧表的每个 ID 1有多个记录,但它们保证对于您从该表返回的变量具有相同的值,则可以distinct在子查询中使用以将它们减少为单个记录。

    select * from a left join (select distinct x,y from b) b on a.x=b.x

  • 如果右侧表在您有多个记录时返回您想要汇总的值(例如,使用summean),请在子查询中执行此操作,并按 ID 变量分组。

    select * from a left join (select x, sum(y) from b group by x) b on a.x=b.x

  • 否则,您将不得不使用一些逻辑 - 无论是在查询中,还是在您加入之前。这就是在 SAS 数据步骤中执行此操作有时会更好的地方;例如,如果您想要最新的值,在数据步骤中预处理它会更容易一些(SQL 也可以这样做,但它是一个更复杂且通常更慢的查询)。

1我使用术语 ID 来指代您加入表格的任何内容。


推荐阅读