SQL 循环查询还是用In

满庭花醉三千客 2016-07-21 09:39:24
A表100条数据 Id、 B表两千万条数据 Id(索引)、根据A表查询B表的数据

现在我是用游标遍历A表
select * from B wher b.Id = @AId
来查询操作,时间是13分钟左右

如果用 select * from B wher b.Id in (select id from A) 插入临时表#B
然后游标遍历A表
select * from #B wher b.Id = @AId
这样来操作 会不会好些?

还是有别的好方法么?

...全文
1587 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
首选in,如果用循环,就是 要1个语句循环N次,而用in的好处是就1个语句,只运行一次,能提高查询速度
造物主在胃中 2016-07-21
  • 打赏
  • 举报
回复
游标现在基本没人用的东西吧,效率不高,inner join,left join 都行啊
唐诗三百首 2016-07-21
  • 打赏
  • 举报
回复
请问"游标遍历A表"的目的是什么? 建议尽量考虑批量操作的方案.
kingtiy 2016-07-21
  • 打赏
  • 举报
回复
select B.* from B join A on A.id=b.id 这样直接join就好了.
唐诗三百首 2016-07-21
  • 打赏
  • 举报
回复
建议了解一下游标类型: static / keyset / dynamic 选合适的用于你的环境.
Ginnnnnnnn 2016-07-21
  • 打赏
  • 举报
回复
但从你描述来看,只需要把B中的数据在A里面的筛选出来就可以了吧?为什么还需要临时表?
  • 打赏
  • 举报
回复
引用 8 楼 ap0405140 的回复:
[quote=引用 5 楼 yi_iy 的回复:] A表一对多B表 把B表的数据插入、修改入C表 set @ t1 =(select val from #B where id=@AId and type='1') 是否存在@ t1 执行 插入C set @ t2 =(select val from #B where id=@AId and type='2') 是否存在@ t2 执行 插入C set @ t3 =(select val from #B where id=@AId and type='3') 是否存在@ t3 执行 插入C
从代码看,应该可以不必用到游标, 建议尽量考虑批量操作的方案.[/quote] 是个同步数据的作业。 里面要写好多逻辑的,必须遍历。
唐诗三百首 2016-07-21
  • 打赏
  • 举报
回复
引用 5 楼 yi_iy 的回复:
A表一对多B表 把B表的数据插入、修改入C表 set @ t1 =(select val from #B where id=@AId and type='1') 是否存在@ t1 执行 插入C set @ t2 =(select val from #B where id=@AId and type='2') 是否存在@ t2 执行 插入C set @ t3 =(select val from #B where id=@AId and type='3') 是否存在@ t3 执行 插入C
从代码看,应该可以不必用到游标, 建议尽量考虑批量操作的方案.
  • 打赏
  • 举报
回复
引用 6 楼 yi_iy 的回复:
[quote=引用 4 楼 yupeigu 的回复:] 首选in,如果用循环,就是 要1个语句循环N次,而用in的好处是就1个语句,只运行一次,能提高查询速度
网上说 表的数据多 尽量少用 in 用 select * from b where id= uion select * from b where id= 这样的。 正好B的Id是索引,以为一条 一条查可能比较快[/quote] 对,如果你的in里面数据太多,不建议用in,可以用or代替
  • 打赏
  • 举报
回复
引用 4 楼 yupeigu 的回复:
首选in,如果用循环,就是 要1个语句循环N次,而用in的好处是就1个语句,只运行一次,能提高查询速度
网上说 表的数据多 尽量少用 in 用 select * from b where id= uion select * from b where id= 这样的。 正好B的Id是索引,以为一条 一条查可能比较快
  • 打赏
  • 举报
回复
引用 2 楼 ap0405140 的回复:
请问"游标遍历A表"的目的是什么? 建议尽量考虑批量操作的方案.
A表一对多B表 把B表的数据插入、修改入C表 set @ t1 =(select val from #B where id=@AId and type='1') 是否存在@ t1 执行 插入C set @ t2 =(select val from #B where id=@AId and type='2') 是否存在@ t2 执行 插入C set @ t3 =(select val from #B where id=@AId and type='3') 是否存在@ t3 执行 插入C

22,199

社区成员

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

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