关于SQL基于Email-Company组合的关联筛选技术咨询
解决SQL中基于Email+Company组合筛选的问题
嘿,我完全懂你的困扰——原来的NOT IN只单看Email字段,会误删同一Email下不同Company的记录,而你需要的是仅排除Email和Company完全匹配的组合,对吧?
问题根源
你之前的语句:
select * from #B where email not in (select email from #A)
只检查了Email是否存在于#A中,不管对应的Company是什么。所以只要#A里有某个Email,#B中所有该Email的记录都会被排除,这显然不符合你的需求。
两种正确的解决方案
方案1:使用NOT EXISTS(推荐,性能更优)
这种方式会精确匹配Email和Company的组合,只有当#A中存在完全一致的组合时,才排除#B里的对应记录:
SELECT * FROM #B WHERE NOT EXISTS ( SELECT 1 FROM #A WHERE #A.Email = #B.Email AND #A.Company = #B.Company )
逻辑说明:子查询会逐行检查#B的每条记录,看看#A里有没有和它Email、Company都完全匹配的行。如果没有匹配项,这条#B的记录就会被保留。
方案2:使用LEFT JOIN + IS NULL
这是另一种直观的写法,通过关联两张表后筛选未匹配的记录:
SELECT #B.* FROM #B LEFT JOIN #A ON #B.Email = #A.Email AND #B.Company = #A.Company WHERE #A.Email IS NULL
逻辑说明:将#B和#A按Email+Company组合左关联,关联不上的记录(也就是#A里没有对应组合的),#A的字段会是NULL。筛选这些NULL的行,就是你需要保留的记录。
举个例子验证
假设:
- #A的数据:
Email Company test@abc.com Company1 - #B的数据:
Email Company test@abc.com Company1 test@abc.com Company2 foo@bar.com CompanyX
用上面的任意一种语句查询,结果会保留:
| Company | |
|---|---|
| test@abc.com | Company2 |
| foo@bar.com | CompanyX |
完美符合你的需求——只排除了完全匹配的test@abc.com-Company1,保留了同一Email下的其他Company记录。
内容的提问来源于stack exchange,提问作者user3033661
相关产品推荐
相关产品推荐

