我使用隐式传递连接从Oracle表中查询的数据在SAS WORK库中创建了两个表。我现在想比较表_X的colA中的值和表_Y的colP中的值,如果它们不相等,则将表_X中的colA、colB值插入到表_Y中的colP和colQ值。table_Y的colR值需要通过从SQL查询中获取其值来更新。样本数据
表_X如下
colA | colB |
---|---|
DAVE | 2022年4月1日 |
MARK | 021年1月5日
让我们只使用NAME作为关键变量,使用X和Y作为数据集名称,以减少混淆。
听起来你只想得到NAME值的列表,这些值在X中,但在Y中。在任何SQL风格中都足够简单。
proc sql;
create table new as
select distinct name from X
except
select name from Y
;
quit;
或者,如果X和Y已经按NAME排序,那么只需简单的数据步骤即可。
data new;
merge x(in=inx) y(in=iny);
by name;
if inx and not iny and firt.name then output;
keep name;
run;
一旦你有了这个列表,你就可以把它上传到你的远程数据库中,并用它来驱动查询选择那些新的观察结果来附加到Y。或者,如果列表足够小,你可以用数据集生成一个宏变量,你可以在远程查询中用它生成一个WHERE子句来选择这些值。
下载新数据后,可以使用PROC APPEND将其添加到现有的Y数据集中。因此,如果你的新观察结果被下载到一个名为NEWY的数据集中,那么你可以运行这样的步骤:
proc append base=Y data=NEWY;
run;
假设colR
位于表other_table
中,该表也包含colP
,则可以将整个table_x
移动到目标平台。
然后运行这个脚本(我在CTE中添加数据来测试功能,您不需要WITH子句(:
INSERT INTO table_y
-- your input, don't use in query ...
WITH
table_x(colA,colB) AS (
SELECT 'DAVE',DATE '01-Apr-2022'
UNION ALL SELECT 'MARK',DATE '05-Jan-2021'
UNION ALL SELECT 'ROCK',DATE '10-FEB-2022'
)
,
other_table(colA,colR) AS (
SELECT 'DAVE', 10
UNION ALL SELECT 'MARK',100
UNION ALL SELECT 'ROCK',500
)
-- end of necessary input, real rest of INSERT statemen starts here
SELECT
table_x.colA
, table_x.colB
, other_table.colR
FROM table_x
JOIN other_table USING(colA)
LEFT JOIN table_y ON table_x.colA = table_y.colP
WHERE table_y.colP IS NULL;
控制查询:
SELECT * FROM table_y;
-- out colP | colQ | colR
-- out ------+------------+------
-- out DAVE | 2022-04-01 | 100
-- out MARK | 2021-01-05 | 100
-- out ROCK | 2022-02-10 | 500