SQL技术问询:验证Table A所有记录是否在Table B中匹配存在
验证Table A记录是否全部存在于Table B的解决方法
问题说明
我有两张表Table A(Product, loc)和Table B(Product, Loc),需要验证Table A(对应SQL中的hist表,共8615416条记录)的所有记录是否都在Table B(对应_hist_stg表,共8999626条记录)中存在且完全匹配。尝试使用EXISTS语句查询时结果不准确,执行的SQL如下:
select Prd, loc from hist a where exists (select prd, loc from _hist_stg b where a.prd = b.prd and a.loc = b.loc);--返回930514条记录
问题分析
你当前的SQL是查询Table A中存在于Table B的记录,但你的需求是验证Table A的所有记录是否都在Table B里——核心是要找出Table A中不在Table B的记录,或者对比匹配记录数与Table A总记录数是否一致。当前返回的93万多条仅为匹配的部分,说明大部分Table A的记录未在Table B中找到匹配项。
正确查询方法
1. 找出Table A中未在Table B匹配的记录
这是验证的核心,直接定位不匹配的数据:
-- 方法1:NOT EXISTS(推荐,性能更优) SELECT Prd, loc FROM hist a WHERE NOT EXISTS ( SELECT 1 -- EXISTS仅判断存在性,无需返回列,用1更高效 FROM _hist_stg b WHERE a.prd = b.prd AND a.loc = b.loc );
-- 方法2:LEFT JOIN + IS NULL SELECT a.Prd, a.loc FROM hist a LEFT JOIN _hist_stg b ON a.prd = b.prd AND a.loc = b.loc WHERE b.prd IS NULL;
2. 统计匹配记录数与总记录数对比
通过统计确认是否全部匹配:
-- 统计Table A中匹配Table B的记录数 SELECT COUNT(*) AS matched_count FROM hist a WHERE EXISTS ( SELECT 1 FROM _hist_stg b WHERE a.prd = b.prd AND a.loc = b.loc ); -- 统计Table A总记录数 SELECT COUNT(*) AS total_count FROM hist;
若matched_count等于total_count,则Table A所有记录都在Table B中;否则差值即为不匹配的记录数。
3. 处理NULL值的特殊情况
如果prd或loc存在NULL值,普通的=比较无法匹配NULL,需调整条件:
SELECT Prd, loc FROM hist a WHERE NOT EXISTS ( SELECT 1 FROM _hist_stg b WHERE (a.prd = b.prd OR (a.prd IS NULL AND b.prd IS NULL)) AND (a.loc = b.loc OR (a.loc IS NULL AND b.loc IS NULL)) );
内容的提问来源于stack exchange,提问作者Srinipappu
相关产品推荐
相关产品推荐

