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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:55:24