使用 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;
我使用隐式直通连接从 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;