SQL查询存在不匹配值时,如何仍列出其他匹配结果?
问题描述
查询中因demand_category_id=0在demand_category表中无匹配值,导致整个查询无结果输出。需求:即使存在不匹配的关联条件,也要列出其他符合匹配条件的记录。
相关表结构
process表
fk_unit_id fk_unit_position fk_demand_category 1 2 1
unit表
unit_id 1
unit_position表
unit_position 2
demand_category表
demand_category 1
当前使用的查询语句
SELECT unit_name,unit_position_name,demand_category_name From process INNER JOIN unit ON process.fk_unit_id = unit_id and unit_id =1 INNER JOIN unit_position ON process.fk_unit_position_id = unit_position_id and unit_position_id = 2 INNER JOIN demand_category ON process.fk_demand_category_id = demand_category_id and demand_category_id =0 ;
解决方案
核心问题是你用了INNER JOIN关联demand_category表,当该表无匹配值时,会直接过滤掉所有符合其他条件的记录。要实现需求,只需把demand_category表的关联方式改为LEFT JOIN,并调整筛选条件位置:
SELECT unit_name, unit_position_name, demand_category_name FROM process INNER JOIN unit ON process.fk_unit_id = unit.unit_id INNER JOIN unit_position ON process.fk_unit_position = unit_position.unit_position LEFT JOIN demand_category ON process.fk_demand_category = demand_category.demand_category WHERE unit.unit_id = 1 AND unit_position.unit_position = 2;
说明:
INNER JOIN用于确保process表与unit、unit_position表的匹配记录被保留,将这两个表的筛选条件移到WHERE子句中逻辑更清晰。LEFT JOIN关联demand_category表:即使process中的fk_demand_category在目标表中无匹配(比如你指定的0),也会保留process的记录,对应的demand_category_name会显示为NULL。
如果确实需要筛选demand_category_id=0的记录,但仍要保留其他匹配的基础记录,可调整为:
SELECT unit_name, unit_position_name, demand_category_name FROM process INNER JOIN unit ON process.fk_unit_id = unit.unit_id INNER JOIN unit_position ON process.fk_unit_position = unit_position.unit_position LEFT JOIN demand_category ON process.fk_demand_category = demand_category.demand_category AND demand_category.demand_category = 0 WHERE unit.unit_id = 1 AND unit_position.unit_position = 2;
这种写法会尝试关联demand_category_id=0的记录,若不存在则demand_category_name为NULL,但依然保留符合unit和unit_position条件的process记录。
内容的提问来源于stack exchange,提问作者leo dinaro
相关产品推荐
相关产品推荐

