获取分组结果最新行的嵌套查询及跨表无匹配行查询问题咨询
解决跨表无对应记录的查询需求
针对你描述的场景——prov_index中每个provnum/pi_provnum唯一对应一行,而provider_info中一个provnum可以对应多行,需要找出一方存在但另一方无匹配的记录,我整理了几种实用的SQL写法,结合你的length()额外条件一起说明:
1. 找出provider_info中存在但prov_index中无对应provnum的记录
1.1 获取所有符合条件的行(包含provider_info中重复的provnum行)
如果需要保留provider_info中所有满足“provnum不在prov_index里”且符合length()条件的行,用NOT EXISTS子查询是比较高效的选择(尤其当prov_index的provnum字段有索引时):
SELECT * FROM provider_info pi WHERE NOT EXISTS ( SELECT 1 FROM prov_index idx WHERE idx.provnum = pi.provnum ) AND LENGTH(pi.provnum) [你的具体条件,比如> 5]; -- 替换成实际的长度判断逻辑
也可以用LEFT JOIN配合IS NULL的写法,逻辑更直观:
SELECT pi.* FROM provider_info pi LEFT JOIN prov_index idx ON idx.provnum = pi.provnum WHERE idx.provnum IS NULL AND LENGTH(pi.provnum) [你的具体条件];
1.2 获取唯一的provnum列表(去重后)
如果只需要得到那些在provider_info中存在、但prov_index里没有的唯一provnum值,只需给查询加上DISTINCT即可:
SELECT DISTINCT pi.provnum FROM provider_info pi WHERE NOT EXISTS ( SELECT 1 FROM prov_index idx WHERE idx.provnum = pi.provnum ) AND LENGTH(pi.provnum) [你的具体条件];
2. 反向需求:找出prov_index中存在但provider_info中无对应记录的行
如果之后需要反过来查询prov_index里有但provider_info中没有的记录,写法类似:
SELECT * FROM prov_index idx WHERE NOT EXISTS ( SELECT 1 FROM provider_info pi WHERE pi.provnum = idx.provnum ) AND LENGTH(idx.provnum) [你的具体条件]; -- 如果需要对prov_index的provnum加长度条件
注意事项
- 确保两张表中用于关联的
provnum/pi_provnum字段类型一致,避免因类型不匹配导致的隐式转换,影响查询效率和结果准确性。 - 如果表数据量较大,建议给
prov_index.provnum和provider_info.provnum建立索引,能显著提升查询速度。
内容的提问来源于stack exchange,提问作者S.ov
相关产品推荐
相关产品推荐

