本文介绍如何使用 sql(特别是 mysql)通过 left join 和条件判断,精准识别两张表在指定字段(如 `dni` 和 `business_id`)上的匹配与不匹配记录,并生成含 `is_match` 标志的汇总结果,支持按 `business_id` 筛选。
在实际业务中,常需比对两个结构相似但来源不同的数据表(例如员工主表 vs 同步日志表),既要找出完全匹配的记录,也要保留缺失匹配的“孤儿”数据以便核查。本例中,Table1(含 id, dni_number, name, business_id)与 Table2(含 id, dni, business_id)需基于 dni_number(Table1)与 dni(Tabl
e2)以及 business_id 三重条件联合比对,并返回统一视图,其中 is_match = 1 表示两表中存在完全一致的 dni + business_id 组合,is_match = 0 表示 Table1 中该记录在 Table2 中无对应项。
⚠️ 注意:原答案中提供的 UNION ALL 查询存在严重逻辑缺陷——它仅用 id 字段关联,且 WHERE tblA.id != tblB.id 会导致笛卡尔式误排除,无法准确反映 dni 和 business_id 的真实匹配关系,不可用于生产环境。
✅ 正确解法应使用 LEFT JOIN + CASE 表达式,确保语义清晰、性能可控、结果可靠:
SELECT
t1.id,
t1.dni_number AS dni,
t1.name,
t1.business_id,
CASE
WHEN t2.id IS NOT NULL THEN 1
ELSE 0
END AS is_match
FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.dni_number = t2.dni
AND t1.business_id = t2.business_id
WHERE t1.business_id IN (15451, 23451); -- ✅ 支持按 business_id 精确筛选该查询核心逻辑如下:
? 补充建议:
综上,避免使用无关联条件的旧式逗号连接(如 tblA, tblB)和逻辑错误的 != 筛选;坚持使用显式 JOIN + 明确 ON 条件 + CASE 标记,是构建健壮、可维护、高性能比对查询的黄金实践。