使用SAS或Oracle SQL进行比较和插入



我使用隐式传递连接从Oracle表中查询的数据在SAS WORK库中创建了两个表。我现在想比较表_X的colA中的值和表_Y的colP中的值,如果它们不相等,则将表_X中的colA、colB值插入到表_Y中的colP和colQ值。table_Y的colR值需要通过从SQL查询中获取其值来更新。样本数据

表_X如下

021年1月5日岩石
colA colB
DAVE 2022年4月1日
MARK

让我们只使用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

最新更新