SQL关联查询执行成功返回0行,单表查询有数百行数据求助
解决JOIN查询返回0行但单表查询有数据的问题
以下是针对你的问题的排查和解决步骤:
确认连接字段是否存在交集
你的查询通过epe.person_nbr = p.person_nbr关联两张表,但单表有数据不代表存在匹配的person_nbr值。执行下面的SQL验证是否有重叠的person_nbr:SELECT DISTINCT person_nbr FROM EDH_PHE_encounter epe (nolock) INTERSECT SELECT DISTINCT person_nbr FROM person p (nolock);如果该查询返回0行,说明两张表完全没有匹配的
person_nbr,这就是JOIN返回空结果的核心原因。检查连接字段的数据类型与NULL值
- 确认
EDH_PHE_encounter.person_nbr和person.person_nbr的数据类型是否一致(比如一个是VARCHAR、一个是INT),隐式类型转换会导致匹配失败。 - 检查两张表中
person_nbr的非空情况:
若其中一张表的-- 统计EDH_PHE_encounter中非空的person_nbr数量 SELECT COUNT(*) FROM EDH_PHE_encounter epe (nolock) WHERE person_nbr IS NOT NULL; -- 统计person表中非空的person_nbr数量 SELECT COUNT(*) FROM person p (nolock) WHERE person_nbr IS NOT NULL;person_nbr全为NULL,或两张表的非空person_nbr无交集,都会导致JOIN无结果。
- 确认
排查NOLOCK提示的影响
NOLOCK会读取未提交的脏数据,可能导致查询到临时不一致的数据集(比如刚插入的person数据未提交、或EDH_PHE_encounter的关联字段未更新)。尝试去掉所有(nolock)再执行查询,观察是否能返回结果。修正字段引用的歧义问题
你的查询里有convert(varchar(20),cast (datetime as datetime),101),datetime是SQL关键字,若表中字段名确实为datetime,建议用方括号括起来避免歧义:cast ([datetime] as datetime)。虽然查询执行成功,但这种写法可能引发隐性问题。
内容的提问来源于stack exchange,提问作者user21949256
相关产品推荐
相关产品推荐

