MS SQL Server 2008中多JOIN临时表仅返回首个JOIN匹配结果的问题排查
问题分析与解决方案
首先咱们拆解下你当前查询的逻辑:你用了两次INNER JOIN关联临时表#AccessRights,这相当于给查询加上了两个必须同时成立的条件——要求一条Books记录的City必须匹配#AccessRights中的某个值,并且它的Bookstore也必须匹配#AccessRights中的某个值。
看你提供的数据,#AccessRights里只有'Central1'和'New York'两个值,所以只有同时满足City = 'New York'且Bookstore = 'Central1'的记录会被返回(也就是BookID为1和9的两条数据),这完全符合当前SQL的逻辑,但显然这不是你想要的结果。
你应该是想获取City或者Bookstore任意一个存在于#AccessRights中的记录吧?如果是这样,你的JOIN写法就错了,下面给你两种正确的实现方式:
方式1:使用EXISTS子查询(推荐,性能更优)
这种写法直接检查当前Books记录的City或Bookstore是否在#AccessRights中,逻辑清晰且高效:
SELECT * FROM Books t1 WHERE EXISTS ( SELECT 1 FROM #AccessRights t2 WHERE t2.val = t1.City OR t2.val = t1.Bookstore )
方式2:使用LEFT JOIN + 去重
如果偏好JOIN写法,可以用LEFT JOIN加上OR条件,再过滤掉未匹配的记录,最后去重避免重复行:
SELECT DISTINCT t1.* FROM Books t1 LEFT JOIN #AccessRights t2 ON t2.val = t1.City OR t2.val = t1.Bookstore WHERE t2.val IS NOT NULL
至于你觉得原查询“仅返回首个JOIN的匹配结果”,其实它不是只匹配第一个JOIN的条件,而是只有当两个JOIN条件都满足时才会返回数据,只是刚好在你的数据里,同时满足两个条件的记录很少,才让你产生了这样的误解。
内容的提问来源于stack exchange,提问作者milo2011
相关产品推荐
相关产品推荐

