首次将SAS Merge代码转换为SQL:求助IF D条件转换问题
解决SAS Merge转SQL的
if d;条件问题 首先明确原SAS代码的核心逻辑:
- 对两个表按
rsn_cde排序后合并,in=d标记当前行是否来自dclhcl表,if d;表示只保留dclhcl中存在的所有记录——无论tb208有没有对应匹配的rsn_cde,只要dclhcl里有这条记录就保留;如果tb208无匹配,tb208的字段会显示为缺失值(对应SQL的NULL)。
你之前写的INNER JOIN只保留两边都匹配的记录,不符合原SAS逻辑。正确的SQL应该用左连接(LEFT JOIN),把dclhcl作为左表,确保它的所有记录都被保留:
SELECT t.*, d.* FROM dclhcl d LEFT JOIN tb208 t ON d.rsn_cde = t.rsn_cde;
如果你的SQL方言支持,也可以用RIGHT JOIN实现相同效果(把tb208放在右边):
SELECT t.*, d.* FROM tb208 t RIGHT JOIN dclhcl d ON t.rsn_cde = d.rsn_cde;
两者效果完全等价,都能还原SAS中if d;的筛选逻辑——只保留dclhcl的所有记录,匹配到tb208的就合并对应字段,未匹配的tb208字段为NULL。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

