为何Full Outer Join未返回结果,单独查询Employees2却正常?
问题原因分析
你的FULL OUTER JOIN查询返回空结果,核心问题出在WHERE子句的过滤逻辑:
当执行FULL OUTER JOIN时,理论上会保留两个表中所有匹配和不匹配的行,但你的WHERE a.username = @testuser条件会过滤掉所有Employees1中没有匹配(即a.username为NULL)的行。而测试用户sname并不存在于Employees1的username字段中,所以即使JOIN找到了Employees2中符合条件的记录,也会被这个WHERE条件直接过滤掉。
而第二个单独查询Employees2的语句没有额外的过滤条件,自然能返回正确结果。
解决方法
你可以通过以下两种方式修正查询:
方式1:将Employees1的匹配条件移到JOIN的ON子句中
这样能保留FULL OUTER JOIN的特性,同时匹配两个表的目标用户:
DECLARE @testuser VARCHAR(100) SET @testuser = 'sname' SELECT ISNULL(a.full_name, b.full_name) AS full_name FROM Employees1 AS a FULL OUTER JOIN Employees2 AS b ON a.username = @testuser OR b.email LIKE @testuser + '%' WHERE a.username IS NOT NULL OR b.email IS NOT NULL
方式2:使用UNION ALL合并两个表的查询结果
这种方式更直接,因为你本来就是要从两个表中分别查找目标用户:
DECLARE @testuser VARCHAR(100) SET @testuser = 'sname' SELECT full_name FROM Employees1 WHERE username = @testuser UNION ALL SELECT full_name FROM Employees2 WHERE email LIKE @testuser + '%'
方式2的效率通常更高,因为它不需要执行JOIN操作,而是分别查询两个表后合并结果。
内容的提问来源于stack exchange,提问作者Joe Defill
相关产品推荐
相关产品推荐

