如何将SQL关联更新语句转换为SAS DI中使用最少转换的实现方案
SAS DIS实现P_DEF表关联更新的最少节点方案
我们需要对P_DEF表中同时匹配TMP表RUN_ID、ITEM_ID、ITEM_TITLE三个字段的记录,将RUN_ID值取反。由于SAS的PROC SQL不支持原生SQL带FROM子句的关联更新写法,以下是最少转换节点的实现方案:
方案1:仅需1个转换节点(允许自定义SQL场景)
直接使用「SQL Execute」转换节点,写入兼容PROC SQL的更新逻辑即可,利用EXISTS子查询实现匹配过滤,代码如下:
proc sql noprint; update P_DEF p set RUN_ID = -1 * p.RUN_ID where exists ( select 1 from TMP t where p.RUN_ID = t.RUN_ID and p.ITEM_ID = t.ITEM_ID and p.ITEM_TITLE = t.ITEM_TITLE ); quit;
该方案完全匹配需求逻辑,不需要额外处理中间字段,是最优的最少节点方案。
方案2:仅需2个转换节点(仅允许可视化配置场景)
如果平台限制不能编写自定义SQL,仅用可视化拖拽配置的场景下,两个节点即可实现:
- 第一个节点:「SQL Join」转换
- 输入源配置为P_DEF(左表)、TMP(右表)
- 关联类型选择左连接,关联条件配置三个匹配规则:
P_DEF.RUN_ID = TMP.RUN_ID、P_DEF.ITEM_ID = TMP.ITEM_ID、P_DEF.ITEM_TITLE = TMP.ITEM_TITLE - 输出字段配置:保留P_DEF的所有原生字段,额外将TMP.RUN_ID重命名为
TMP_RUN_ID输出,避免字段重名冲突
- 第二个节点:「Calculator(计算)」转换
- 新增计算逻辑:
RUN_ID = COALESCE(-1 * TMP_RUN_ID, RUN_ID),匹配到TMP的记录会对RUN_ID取反,未匹配的记录保留原值 - 输出字段仅保留P_DEF的原生字段,丢弃临时字段
TMP_RUN_ID即可得到更新后的目标表
- 新增计算逻辑:
内容的提问来源于stack exchange,提问作者B--rian
相关产品推荐
相关产品推荐

