如何统计Table1中存在但Table2中缺失的产品数量(列名不同)
嘿,这个需求我经常碰到,给你几个实用的SQL查询方案,都能精准算出你要的「Table1存在但Table2没有的产品数量」,也就是需要手动添加的产品数:
方法1:用NOT EXISTS子查询(推荐,性能稳定)
这种方法在绝大多数数据库(MySQL、PostgreSQL、SQL Server等)里都能正常运行,而且当两个表的主键列有索引时,查询效率很高:
SELECT COUNT(*) AS need_add_count FROM Table1 WHERE NOT EXISTS ( SELECT 1 FROM Table2 WHERE Table2.code_table2 = Table1.code_table1 );
逻辑很直白:遍历Table1的每一行,检查Table2里有没有相同主键值的记录,没有的话就算入统计。
方法2:LEFT JOIN + IS NULL
这也是很常用的写法,通过左连接保留Table1的所有行,然后筛选出Table2那边没有匹配到的记录(也就是code_table2为NULL的行):
SELECT COUNT(DISTINCT Table1.code_table1) AS need_add_count FROM Table1 LEFT JOIN Table2 ON Table1.code_table1 = Table2.code_table2 WHERE Table2.code_table2 IS NULL;
这里加DISTINCT是为了防止Table1里有重复主键(虽然主键应该唯一,但保险起见可以加上),如果你的Table1主键绝对唯一,也可以直接用COUNT(*)。
方法3:NOT IN(注意避坑)
如果你的Table2里code_table2列绝对没有NULL值,可以用这种写法,代码更简洁:
SELECT COUNT(*) AS need_add_count FROM Table1 WHERE code_table1 NOT IN ( SELECT code_table2 FROM Table2 );
⚠️ 重点提醒:如果Table2的code_table2存在NULL值,NOT IN会返回空结果,因为SQL里任何值和NULL比较都返回未知,所以这种情况千万别用这个方法。
用你的测试数据验证
按照你给出的示例:
- Table1的code_table1:A1001、A1002、A1003、A1004、A1005、A1006
- Table2的code_table2:A1001、A1002、A1003、A1004
执行上面任意一种查询,结果都会是2,对应A1005和A1006这两个需要手动添加的产品。
内容的提问来源于stack exchange,提问作者David Noriega
相关产品推荐
相关产品推荐

