我有一个非常长的查询,使用不同的交叉,当查询增长太长时我执行它会抛出异常
SELECT DISTINCT RTypeId FROM dbo.User_Res WHERE UserId = '1749'
INTERSECT SELECT DISTINCT RTypeId FROM dbo.User_Res WHERE UserId = '424'
INTERSECT SELECT DISTINCT RTypeId FROM dbo.User_Res WHERE UserId = '1906'
INTERSECT SELECT DISTINCT RTypeId FROM dbo.User_Res WHERE UserId = '725'
INTERSECT SELECT DISTINCT RTypeId FROM dbo.User_Res WHERE UserId = '1596'
你可以帮助我替代这个查询吗?
错误消息:
查询处理器耗尽了内部资源,无法生成查询计划。这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询。请简化查询。
答案 0 :(得分:1)
基本上你想要的是获得所有用户共同的RTypeIds吗?
您可以通过以下方式构建相同的查询:
with userrt (rid, uid)
as (select distinct rtypeid, userid from User_Res where UserId in (1749, 424, 1906 ...)
select rid, count(uid) as cuid
from userrt
group by rid
现在只有那些在限制条款中具有cuid == userid's数量的结果行才是您感兴趣的(因为它们已经存在于所有用户中,因此对所有用户都是通用的)。