如何用SQL对比Snowflake测试与生产库同表code_num列差异
验证测试与生产环境表code_num列差异的SQL方法
下面是几种简便的SQL实现方式,可根据你的需求选择:
方法1:找出仅存在于单环境的code_num
适用于仅需要验证code_num的存在性是否一致的场景:
-- 仅存在于测试环境的code_num SELECT code_num FROM test_db.target_table EXCEPT SELECT code_num FROM prod_db.target_table UNION ALL -- 仅存在于生产环境的code_num SELECT code_num FROM prod_db.target_table EXCEPT SELECT code_num FROM test_db.target_table;
说明:EXCEPT会返回左侧结果集中右侧没有的记录,UNION ALL合并两边独有的数据,最终结果就是两边存在差异的code_num。
方法2:同时验证存在性与重复数量
如果需要确保每个code_num的出现次数也完全一致,可使用此方法:
-- 测试环境中数量与生产不一致的code_num SELECT code_num, COUNT(*) AS test_count, (SELECT COUNT(*) FROM prod_db.target_table p WHERE p.code_num = t.code_num) AS prod_count FROM test_db.target_table t GROUP BY code_num HAVING test_count != prod_count UNION ALL -- 生产环境中数量与测试不一致的code_num SELECT code_num, (SELECT COUNT(*) FROM test_db.target_table t WHERE t.code_num = p.code_num) AS test_count, COUNT(*) AS prod_count FROM prod_db.target_table p GROUP BY code_num HAVING (SELECT COUNT(*) FROM test_db.target_table t WHERE t.code_num = p.code_num) != COUNT(*)
说明:通过子查询获取对应code_num在另一环境的计数,对比后筛选出数量不一致的记录,同时覆盖了仅存在于单环境的情况(此时其中一侧计数为0)。
方法3:使用全外连接统一对比
如果两个环境的表在同一数据库实例下,全外连接的方式更直观:
SELECT COALESCE(t.code_num, p.code_num) AS code_num, COALESCE(COUNT(t.code_num), 0) AS test_total, COALESCE(COUNT(p.code_num), 0) AS prod_total FROM test_db.target_table t FULL OUTER JOIN prod_db.target_table p ON t.code_num = p.code_num GROUP BY COALESCE(t.code_num, p.code_num) HAVING test_total != prod_total;
说明:FULL OUTER JOIN会包含两边所有的code_num,COALESCE处理NULL值(即某环境无该code_num的情况),最终筛选出计数不一致的记录。
注意事项
- 若两个环境不在同一数据库实例,需先通过数据库跨实例连接工具(如SQL Server链接服务器、MySQL FEDERATED引擎)将数据拉至同一环境,或导出数据后本地对比。
- 数据量较大时,建议给
code_num列添加索引,提升查询效率。
内容的提问来源于stack exchange,提问作者Zmelgar K1R3D2
相关产品推荐
相关产品推荐

