我需要编写一个使用EXISTS而不是IN的查询,以便它能够快速运行。过滤器被输入如此多的参数值,EXISTS似乎是唯一的选择。区别在于20分钟以上的查询和5秒的查询。
这是我的查询:
SELECT DISTINCT d.GROUP_NAME
FROM [EMPLOYEE] e JOIN [DATA_FACT] d ON (e.KEY = d.KEY)
WHERE d.DATE BETWEEN @Start and @End
AND EXISTS
(
select '1234567' -- @ID
)
AND e.Location IN (@Location)
ORDER BY d.GROUP_NAME ASC
问题是它返回了太多记录。基于我传递给过滤的值,我应该得到1行,但我得到28。
如果我删除EXISTS并添加以下内容,那么我将得到我需要的1条记录:
AND e.ID IN ('1234567')
有没有办法修复查询以使用EXISTS以便我得到正确的结果?
答案 0 :(得分:0)
如果您打算尝试使用exists来过滤employee表中的参数来过滤data_fact表,那么这基本上就是您想要的。当你向其投入大量员工ID时,不确定它会改善你的表现。
SELECT
d.GROUP_NAME
FROM [DATA_FACT] AS d
WHERE d.DATE BETWEEN @Start and @End
AND EXISTS
(
select 1
from EMPLOYEE AS e
WHERE d.[KEY] = e.[KEY]
AND e.[Location] IN (@Location)
AND e.ID IN ('1234567')
)
ORDER BY d.GROUP_NAME ASC