如何筛选t1中存在但t2中不存在的行(匹配cust_id与product列)
筛选t1中存在但t2中不存在的行(基于cust_id和product匹配)
表结构
t1表数据:
cust_id product score 1 bat 0.8 2 ball 0.3 2 phone 0.6 3 tv 1.0 2 bat 1.0 4 phone 0.2 1 ball 0.6
t2表数据:
cust_id product 1 bat 2 phone 3 tv
需求
需要筛选出t1中存在,但t2里没有相同cust_id和product组合的行,预期输出如下:
cust_id product score 2 ball 0.3 2 bat 1.0 4 phone 0.2 1 ball 0.6
你的查询问题分析
你写的查询有两个明显错误:
- JOIN关联条件错误:
ON t1.cust_id = t1.cust_id完全没关联t2的字段,应该同时匹配cust_id和product两个字段 - 拼写错误:
WHERE t2.product IS NUL里的NUL少了一个L,正确写法是NULL
正确查询写法
方法一:LEFT JOIN + 筛选NULL
修正关联条件和拼写错误即可:
SELECT t1.* FROM t1 LEFT JOIN t2 ON t1.cust_id = t2.cust_id AND t1.product = t2.product WHERE t2.product IS NULL;
原理:LEFT JOIN会保留t1所有行,匹配不到t2对应组合的行中,t2的字段会是NULL,通过这个条件就能筛选出目标行。
方法二:NOT EXISTS子查询
用子查询判断当前t1的行是否在t2中不存在:
SELECT t1.* FROM t1 WHERE NOT EXISTS ( SELECT 1 FROM t2 WHERE t2.cust_id = t1.cust_id AND t2.product = t1.product );
原理:逐行检查t1的每一行,只要t2中没有相同的cust_id+product组合,就保留该行。
内容的提问来源于stack exchange,提问作者Danish
相关产品推荐
相关产品推荐

