34,593
社区成员
发帖
与我相关
我的任务
分享
--借助系统表来写个例子 不知是否能提快你的查询速度
--你的问题使用了charindex()h函数,基本上可以说A.CODE这个字段上的索引废了 我的方法没测试过 单手我避开这个函数
create table #test
(
id int identity,
value int
)
declare @str varchar(max)
set @str='1|2|3|4|36|'
set @str=REPLACE(@str,'|',' union all select ')
set @str='insert #test(value) select '+LEFT(@str,LEN(@str)-17)
print @str
exec (@str)
select * from #test
/*
id value
----------- -----------
1 1
2 2
3 3
4 4
5 3
(5 行受影响)
*/
--然后再inner join返回你的数据
select
a.number,
a.name,
a.type
from
master..spt_values a
inner join
#test b
on
a.number=b.value and a.type='p'
/*
number name type
----------- ----------------------------------- ----
1 NULL P
2 NULL P
3 NULL P
4 NULL P
36 NULL P
(5 行受影响)
*/
我看了执行计划 除了对我建的临时表#test进行了表扫描
master..spt_values表上的索引被充分利用到了
select
a.number,
a.name,
a.type
from
master..spt_values a
where CHARINDEX('|'+LTRIM(number)+'|','|'+'1|2|3|4|36|')>0 and type='p'
--借助系统表来写个例子 不知是否能提快你的查询速度
--你的问题使用了charindex()h函数,基本上可以说A.CODE这个字段上的索引废了 我的方法没测试过 单手我避开这个函数
create table #test
(
id int identity,
value int
)
declare @str varchar(max)
set @str='1|2|3|4|36|'
set @str=REPLACE(@str,'|',' union all select ')
set @str='insert #test(value) select '+LEFT(@str,LEN(@str)-17)
print @str
exec (@str)
select * from #test
/*
id value
----------- -----------
1 1
2 2
3 3
4 4
5 3
(5 行受影响)
*/
--然后再inner join返回你的数据
select
a.number,
a.name,
a.type
from
master..spt_values a
inner join
#test b
on
a.number=b.value and a.type='p'
/*
number name type
----------- ----------------------------------- ----
1 NULL P
2 NULL P
3 NULL P
4 NULL P
36 NULL P
(5 行受影响)
*/
我看了执行计划 除了对我建的临时表#test进行了表扫描
master..spt_values表上的索引被充分利用到了 而临时表的数据量肯定是有限的 不会有很多 如果真的数据量很大,可以考虑给临时表的value字段加上索引
--个人一个想法 仅供参考