本文介绍如何使用 sql(特别是 left join 与条件判断)精准比对两个含 dni 和 business_id 的 mysql 表,生成带 is_match 标志的合并结果,并支持按 business_id 过滤,避免笛卡尔积和逻辑错误。
要实现题中需求——即对 Table1(含 id, dni_number, name, business_id)与 Table2(含 id, dni, business_id)进行逐记录比对,输出每条 Table1 记录及其在 Table2 中是否存在 DNI + business_id 双重匹配,并标记 is_match = 1 或 0,同时支持按指定 business_id 筛选——原始答案中使用 UNION ALL 配合笛卡尔积(隐式 , 连接)存在严重缺陷:它会产生大量无效组合、无法正确关联字段,且 tblA.id != tblB.id 的条件完全不能表达“DNI 不匹配”的语义。
✅ 正确解法应基于 LEFT JOIN + COALESCE/IS NULL 判断,以 Table1 为主表,按 dni_number = dni AND Table1.business_id = Table2.business_id 进行左连接:
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 = ?; -- 替换为具体值,如 15451;也可用 IN (15451, 23451)
? 关键说明:
⚠️ 注意事项:
此方案结构清晰、语义准确、可维护性强,是生产环境中处理两表存在性比对的标准实践。