使用 SAS 或 Oracle SQL 比较和插入

Compare and Insert using SAS or Oracle SQL

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

Table_X如下

colA colB
DAVE 01-Apr-2022
MARK 05-Jan-2021
ROCK 10-FEB-2022

Table_Y如下

colP colQ colR
DAVE 01-Apr-2022 100

我本质上想要的是 如果 Value.Table_X.colA != Value.Table_Y.colP 然后分别将 Table_X.colA 和 Table_X.colB 的值插入到 Table_Y.colP 和 Table_Y.colQ 中。 Table_Y.colR 值将由 SQL 查询填充(我可以使用隐式或显式直通连接连接到 SQL 数据库)

Table_Y 的最终输出应如下所示

colP colQ colR
DAVE 01-Apr-2022 100
MARK 05-Jan-2021 200
ROCK 10-FEB-2022 500

我如何在 SAS and/or Oracle SQL 中执行此操作(我可以使用显式传递在 Oracle 中推送 Table_X 和 Table_Y 并使用 Oracle 语法) .

假设 colR 位于 table other_table 中,还包含 colP,您可以将整个 table_x 移动到目标平台。

然后运行这个脚本(我在CTE-s中添加数据来测试功能,你不需要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

我们只使用 NAME 作为关键变量,使用 X 和 Y 作为数据集名称以减少混淆。

听起来您只想获取 X 中但不在 Y 中的 NAME 值列表。在 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;

获得该列表后,您可以将其上传到远程数据库并使用它来驱动查询 select 那些新的观察结果以附加到 Y。或者如果列表足够小,您可以使用dataset 来生成一个宏变量,您可以使用它在远程查询中生成 WHERE 子句以仅 select 这些值。

下载新数据后,您可以使用 PROC APPEND 将其添加到现有的 Y 数据集中。因此,如果您的新观察结果被下载到名为 NEWY 的数据集中,那么您可以 运行 这样的步骤:

proc append base=Y data=NEWY;
run;