PostgreSQL左连接查询:如何仅获取无代理或代理有效的员工
解决方案
你可以通过在查询中添加WHERE条件来过滤掉那些关联了无效代理机构的员工,无需使用UNION,这里有两种简洁的写法:
写法一:基于左连接后过滤
select e.*, a.* from employee e left join agency a on a.id = e.agencyID and a.valid = true where e.agencyID is null or a.id is not null;
逻辑说明:
- 左连接时仅匹配
valid = true的代理机构,此时:- 无代理的员工:
e.agencyID为null,会被e.agencyID is null条件保留; - 关联有效代理的员工:
a.id不为null,会被a.id is not null条件保留; - 关联无效代理的员工:
e.agencyID不为null但a.id为null,会被条件排除。
- 无代理的员工:
写法二:先关联所有代理再过滤
select e.*, a.* from employee e left join agency a on a.id = e.agencyID where e.agencyID is null or a.valid = true;
逻辑说明:
- 先左连接所有关联的代理机构,再通过
WHERE条件直接筛选:- 保留无代理的员工(
e.agencyID is null); - 保留关联了
valid = true的代理机构的员工; - 自动排除有代理但
valid = false的员工。
- 保留无代理的员工(
这两种写法都比UNION更简洁高效,推荐根据实际数据量选择(写法二逻辑更直观,写法一在代理机构数据量大时可能性能更优)。
内容的提问来源于stack exchange,提问作者tmp dev
相关产品推荐
相关产品推荐

