MySQL连接两表时如何保留part_number不匹配的行?
解决方案:获取两表part_number的全量对比(含仅单表存在的记录)
你现在的查询用的是内连接(JOIN),这只会返回两张表中part_number完全匹配的行,再加上current_inv_qty > qb_qty的过滤,自然看不到仅在单表存在的记录。要实现你要的效果,得用全外连接(FULL OUTER JOIN),它能返回两张表的所有记录:既包含part_number匹配的行,也包含仅在current_inv里有、或者仅在qb_inventory_levels_v里有的行。
完整查询语句
SELECT sub_2.part_number AS part_number_a, sub_1.part_number AS part_number_b, sub_2.current_inv_qty AS qty_a, sub_1.qb_qty AS qty_b FROM ( SELECT part_number, COUNT(part_number) AS current_inv_qty FROM utility_views.current_inv GROUP BY part_number ) sub_2 FULL OUTER JOIN ( SELECT part_number, SUM(quantityonhand) AS qb_qty FROM qb_inventory_levels_v GROUP BY part_number ) sub_1 ON sub_1.part_number = sub_2.part_number -- 如果既要保留原查询里"current_inv_qty > qb_qty"的匹配行,又要保留单表存在的记录,就把下面这行注释去掉: -- WHERE sub_2.current_inv_qty > sub_1.qb_qty OR sub_2.part_number IS NULL OR sub_1.part_number IS NULL
关键说明
- FULL OUTER JOIN:会涵盖两个子查询结果里的所有行,要是某行只在其中一个子查询里存在,另一子查询对应的字段就会显示成
NULL,和你给的示例格式完全对上。 - 字段别名:特意用
part_number_a、part_number_b分别对应两张表的part_number,qty_a、qty_b对应各自的数量,和示例结构保持一致。 - 可选过滤:如果需要同时保留原查询中
current_inv_qty > qb_qty的匹配行,以及仅单表存在的记录,取消最后一行WHERE条件的注释就行。
内容的提问来源于stack exchange,提问作者ijoubert21
相关产品推荐
相关产品推荐

