在某些条件下合并两个表

时间:2014-02-06 15:26:59

标签: sql sas

我需要一些proc SQL的帮助。我有这样一张桌子

ID1    ID2           DR1    DR2
  1    03/04/2009    158      0
  2    12/06/2009    214      0
  2    05/02/2009     59      0
  1    03/04/2009      0    158
  2    03/04/2009    225      0

并且我想创建一个新表,其中每行DR2不为空,并且对于这些行中的每一行,搜索是否存在具有相同ID1和ID2且DR1等于DR2的值的另一行

对于这个例子,它会给我这个表:

ID1    ID2           DR1    DR2
  1    03/04/2009      0    158
  1    03/04/2009    158      0

我尝试分两步但没有成功:

data tmpTable;
    set Table;
    where DR2>0;
run;

proc sql;
    create table wanted as
    select * from tmpTable
    inner join Table on Table.ID1 = tmpTable.ID1 
                         and Table.ID2 = tmpTable.ID2 
                         and Table.DR1 = tmpTable.DR2;
quit;

2 个答案:

答案 0 :(得分:1)

您可以将文件与正确的where语句合并在一起。

请注意,null.而不是0 - (您的数据步骤正在消除dr2 = 0的行,从而无法使您的结果表无效)

proc sql;
    create table wanted as
    select distinct * 
    from table_have a, table_have b
    where 
            a.id1 = b.id1
        and  
            a.ID2 = b.ID2
        and  
            a.DR2 = b.DR1
        and
            a.dr2 ne .
    ;
quit;

答案 1 :(得分:1)

使查询正常工作,然后您只需添加它的创建表版本。

它应该只是一个基于相反列值的简单自连接,如下所示。

SELECT
      t1.d1,
      t1.id2,
      t1.dr1,
      t1.dr2
   from 
      Table t1
         JOIN Table t2
            ON t1.d1 = t2.d1
            AND t1.dr1 = t2.dr2
            AND t1.dr2 = t2.dr1
   where
         t1.dr1 > 0
      OR t2.dr2 > 0

我会确保你在(d1,dr1,dr2)上有一个索引用于性能目的。

您提到您只需要DR2具有值(非零/空)的记录。 where子句将确保至少其中一列具有值。因此,在您的示例中,它将找到158/0(第二列中为零),但是反过来(0,158)您的符合条件的DR2不为空。

返回两个版本的唯一时间是反转显示为连接表时。