You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 20:23:12