You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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的数据:
    EmailCompany
    test@abc.comCompany1
  • #B的数据:
    EmailCompany
    test@abc.comCompany1
    test@abc.comCompany2
    foo@bar.comCompanyX

用上面的任意一种语句查询,结果会保留:

EmailCompany
test@abc.comCompany2
foo@bar.comCompanyX

完美符合你的需求——只排除了完全匹配的test@abc.com-Company1,保留了同一Email下的其他Company记录。

内容的提问来源于stack exchange,提问作者user3033661

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:26:07