sql in 的替代方法

1988525 2014-06-18 10:51:56
表a 有20w条数据 有个主键自动增长的id ,
这时,程序传过来4000多个id,中间用,隔开,我目前查询的写法是用in(4000个id),但这中方法太慢了 我想找个快的写法,能快速的查到数据
...全文
941 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
1988525 2014-06-18
  • 打赏
  • 举报
回复
引用 6 楼 DBA_Huangzj 的回复:
in我曾是试过,1000个左右的ID就会导致执行计划无法生成,即使能生成,效率极低
ok 就是把原来的in改成join 这种会快吧,我写出来客了谢了
發糞塗牆 2014-06-18
  • 打赏
  • 举报
回复
in我曾是试过,1000个左右的ID就会导致执行计划无法生成,即使能生成,效率极低
發糞塗牆 2014-06-18
  • 打赏
  • 举报
回复
select a.* from 源表 a inner join (转换后的id表) b on a.id=b.id
1988525 2014-06-18
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
通过函数先把id转换成表,然后用join的方法
join怎么写 举个例子 那个函数已经分割了
山寨DBA 2014-06-18
  • 打赏
  • 举报
回复
如果4000个ID是连续的,可以使用between and 。。。 否则的话,用1楼黄版主的方法似是奇妙
發糞塗牆 2014-06-18
  • 打赏
  • 举报
回复
例子:
--1.函数
if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')
   drop function dbo.f_splitSTR
go
 
create function dbo.f_splitSTR
(
    @s varchar(8000),     --要分拆的字符串
    @split varchar(10)    --分隔字符
) 
returns @re table(                      --要返回的临时表
                     col varchar(1000)  --临时表中的列 
                 )
as
begin   
  declare @len int
   
  set @len = LEN(@split)      --分隔符不一定就是一个字符,可能是2个字符
   
  while CHARINDEX(@split,@s) >0
  begin
    insert into @re 
    values(left(@s,charindex(@split,@s) - 1))
     
    set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'')    --覆盖:字符串以及分隔符
  end
   
  insert into @re values(@s)
   
  return   --返回临时表
end
go  
 
 
 
declare @res varchar(100)
set @res='1 2 3 4 5';
 
set @res = REPLACE(@res,' ',',')
 
select * from dbo.f_splitSTR(@res,',') t 
/*
col
1
2
3
4
5
*/
發糞塗牆 2014-06-18
  • 打赏
  • 举报
回复
通过函数先把id转换成表,然后用join的方法

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧