如何通过条件LEFT JOIN获取指定客户未在t2中的交易数据
解决方案
核心思路
要拿到目标数据,得抓好两个筛选关键点:
- 只针对在t2里有至少一笔交易的客户
- 从这些客户的t1交易里,排除掉已经在t2出现过的交易
推荐SQL语句
SELECT t1.cust_code_1, t1.trans_code_1 FROM t1 -- 只保留t2中存在的客户 WHERE t1.cust_code_1 IN (SELECT DISTINCT cust_code_2 FROM t2) -- 剔除t1里已经在t2存在的交易 AND NOT EXISTS ( SELECT 1 FROM t2 WHERE t2.cust_code_2 = t1.cust_code_1 AND t2.trans_code_2 = t1.trans_code_1 ) -- 过滤掉不需要的异常记录 AND t1.cust_code_1 != '.' AND t1.cust_code_1 != '3';
语句解释
IN (SELECT DISTINCT cust_code_2 FROM t2):直接锁定t2里有交易的客户,避免无关客户混入NOT EXISTS:精准匹配客户和交易,比LEFT JOIN后判空更高效,还能避免出现多余的无效匹配记录- 最后两行:直接过滤掉你提到的
cust_code_1=3和特殊字符.的异常数据,可根据实际情况调整
可选LEFT JOIN优化写法
如果一定要用LEFT JOIN,得严格加过滤条件,避免多余记录:
SELECT t1.cust_code_1, t1.trans_code_1 FROM t1 LEFT JOIN t2 ON t1.cust_code_1 = t2.cust_code_2 AND t1.trans_code_1 = t2.trans_code_2 -- 确保是t2里存在的客户 WHERE t2.cust_code_2 IS NOT NULL -- 确保该交易在t2里不存在 AND t2.trans_code_2 IS NULL -- 过滤异常记录 AND t1.cust_code_1 != '.' AND t1.cust_code_1 != '3';
注意:这种写法必须同时用客户和交易做关联条件,不然会出现大量无效的NULL匹配,导致多余记录。
内容的提问来源于stack exchange,提问作者mr analyst
相关产品推荐
相关产品推荐

