问题在于: LeadsWalkIn = CASE WHEN(WORK.WORK_ID NOT IN(选择WorkId FROM #WORKSHEETS)和WORK.AGRA_ID = CU.AFFINITY_GROUP_ID)那么1 ELSE 0 END, 长期以来,我得到了时间。 有没有其他方法可以更快地获得相同的结果? 感谢
答案 0 :(得分:1)
鉴于当前的#WORKSHEETS表定义(假设WorkId
保证为非空),我将避免使用子查询,而是使用外部联接操作。我们需要保证匹配的行不会超过一行,因此我们可以使用DISTINCT或GROUP BY来获取WorkId的唯一列...
LEFT JOIN ( SELECT DISTINCT WorkId FROM #WORKSHEETS ) w
ON w.WorkId = WORK.WORK_ID
然后更改SELECT列表中的表达式,以检查“无匹配行”条件:
CASE WHEN w.WorkId IS NULL AND ...
如果#WORKSHEETS
表没有用于其他任何内容,我会考虑只插入WorkId的唯一值,方法是在填充#WORKSHEETS
表的查询中添加GROUP BY或DISTINCT ,然后仅使用对#WORKSHEETS
的引用代替内联视图查询(w
)。
在#WORKSHEETS
上添加适当的索引可以提高联接操作的性能。如果我们只有WorkId的不同值,那甚至可能是一个独特的索引。
答案 1 :(得分:0)
在填充后,尝试在#Worksheets上创建索引,类似于:
CREATE CLUSTERED INDEX [ClusteredIndexName] ON [dbo].[#worksheets]
(
[workid] ASC
)
可以进一步优化,但如果您将代码作为文本而不是图像发布,则会更容易。
答案 2 :(得分:0)
示例逻辑:
ex数据:
Work xxx
-----------
A A
B B
x C
x D
E x
F x
如果您想获得这样的结果,请使用左连接:
if WORK.AGRA_ID = CU.AFFINITY_GROUP_ID
Work xxx value
--------------------
A A 0
B B 0
E x 1
F x 1
试试这个:
你的选择你想要:
LeadsWalkIn = CASE WHEN (xxx.WorkId is null AND WORK.AGRA_ID = CU.AFFINITY_GROUP_ID) THEN 1 ELSE 0 END,
并且您的加入查询会添加到上次加入:
Left Join #WORKSHEETS xxx On xxx.WorkId = WORK.WORK_ID