编辑:我在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看起来很好......答案 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;
这确实需要对两个表进行排序。如果您有性能需求,有很多不同的方法(哈希表,格式查找等)。