问题描述
SELECT
DEP.CUST_ORG_CD,DEP.CUST_NO,DEP.DP_ACT_NO
FROM R_DBLNK_US.DW_TRN_DEPO_ACC_D DEP
UNION
SELECT
DEP.CUST_ORG_CD,DEP.DP_ACT_NO
FROM R_DBLNK_US.DW_MST_ACC_D DEP
...返回两行(每个表各一个)
CUST_ORG_CD CUST_NO ACT_NO
5 321 8
5 321 9
我存储在临时表中。然后,我想返回所有三列,但在前两列上使用disTINCT,这样在这种情况下将不返回第二行。
解决方法
我建议在第二个子查询中使用not exists
,以过滤出与前两列中第一个结果集匹配的记录。
select cust_org_cd,cust_no,dp_act_no
from r_dblnk_us.dw_trn_depo_acc_d
union all
select cust_org_cd,dp_act_no
from r_dblnk_us.dw_mst_acc_d d2
where not exists (
select 1
from r_dblnk_us.dw_trn_depo_acc_d d1
where d1.cust_org_cd = d2.cust_org_cd and d1.cust_no = d2.cust_no
)
旁注:我将union
更改为union all
;除非子查询本身生成重复项,否则不会更改结果集,并且效率更高。
可能我建议使用如下所示的内容来定义要保留的内容,然后通过WHERE RowNumber = 1进行过滤
ROW_NUMBER() OVER (PARTITION BY CUST_ORG_CD,CUST_NO ORDER BY ACT_NO) AS RowNumber