如果两个键匹配,则使用另一个表中的数据覆盖一个表中的数据

时间:2013-12-03 18:12:36

标签: sql sas

编辑:我在SAS中使用PROC SQL功能。

如果两个ID匹配,我正在尝试使用辅助表中的数据覆盖主表中的数据。基本上,有一个过程修改与各种ID相关联的某些值,并且在完成该过程之后,我想更新与主表中的那些ID相关联的值。有一个非常简单的例子:

主要表格:

PROD_ID          PRICE           IN_STOCK    
   1              5.25              17   
   2             10.24             200       [...additional fields...]
   3              6.42             140   
  ...

辅助表:

PROD_ID          PRICE           IN_STOCK
   2             11.50             175   
   3              6.42             130   

我正试图让新的主表看起来像这样:

PROD_ID          PRICE           IN_STOCK
   1              5.25              17   
   2             11.50             175       [...additional fields...]
   3              6.42             130   
  ...

因此,如果密钥匹配,它会覆盖主表中的某些列。

在非工作的SQL代码中,我正在尝试做的是这样的事情:

INSERT INTO PRIMARY_TABLE (PRICE, IN_STOCK)
SELECT PRICE, IN_STOCK
FROM SECONDARY_TABLE
WHERE SECONDARY_TABLE.PROD_ID = PRIMARY_TABLE.PROD_ID

这可以在这样的一个声明中做,或者我是否必须找出使用临时表的一些解决方法(这是我试图避免的)?

编辑:目前的答案似乎都没有用,虽然这可能是我的错 - 我在SAS中使用PROC SQL而没有指定,所以有可能缺少某些功能吗?例如,“FROM”关键字在使用UPDATE时不会变为蓝色,并在尝试运行时抛出错误,但UPDATE和SET看起来很好......

4 个答案:

答案 0 :(得分:1)

您真的想插入新数据吗?或更新现有行?如果要更新,请加入表格:

UPDATE PT
SET
    PT.PRICE = ST.PRICE,
    PT.IN_STOCK = ST.IN_STOCK
FROM
    PRIMARY_TABLE PT JOIN SECONDARY_TABLE ST ON PT.PROD_ID = ST.PROD_ID

答案 1 :(得分:0)

试试这个:

 INSERT INTO PRIMARY_TABLE (PRICE, IN_STOCK) VALUES
    (SELECT PRICE, IN_STOCK
    FROM SECONDARY_TABLE
    JOIN PRIMARY_TABLE ON SECONDARY_TABLE.PROD_ID = PRIMARY_TABLE.PROD_ID)

答案 2 :(得分:0)

您必须使用INSERT语句的唯一原因是,如果辅助表中存在ID且主表中不存在INSERT INTO PRIMARY_TABLE (ID, PRICE, IN_STOCK) SELECT ID, PRICE, IN_STOCK FROM SECONDARY_TABLE s ON DUPLICATE KEY UPDATE PRICE = s.PRICE, IN_STOCK = s.IN_STOCK 。如果不是这种情况,则使用常规UPDATE语句。如果是这种情况,请使用以下内容:

{{1}}

答案 3 :(得分:0)

SAS PROC SQL中的一个答案就是将其作为左连接并使用COALESCE,它选择第一个非缺失值:

data class;
set sashelp.class;
run;
data class_updates;
input name $ height weight;
datalines;
Alfred 70 150
Alice 59 92
Henry 65 115
Judy 66 95
;;;;
run;


proc sql;
create table class as select C.name, coalesce(U.height,C.height) as height, coalesce(U.weight,C.weight) as weight
    from class C
    left join class_updates U
    on C.name=U.name;
quit;

在这种情况下,虽然SQL之外的SAS解决方案在编码的简单性方面是优越的。

data class;
update class class_updates(in=u);
by name;
run;

这确实需要对两个表进行排序。如果您有性能需求,有很多不同的方法(哈希表,格式查找等)。