sql 中代替 in(...) 的写法.....................等....

fwqkey 2009-07-27 09:32:14
写sql的人都知道,sql语句中in(...)里面的条件很多的话会很影响效率的..

比如:
select * from table where id in(....)


如果里面的id数有上千上万个的话执行的效率会相当的慢..

所以想问下 大家有没有代替in()的写法(当然,得到的数据必须是一样的)..就以我上面的sql为例..

呵呵..期待好代码呀..
...全文
1596 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
fwqkey 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lyw110 的回复:]
把 in(...) 里面成千上万的数据插入到临时表,再连表查询。
[/Quote]这是个好办法..呵呵
bea_java 2009-07-27
  • 打赏
  • 举报
回复

--表A
--表B
--A表中的列有和B表的某个列同数据类型
select * from A left join B where A.a = B.a
等不到来世 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wufeng4552 的回复:]
引用 10 楼 lyw110 的回复:
把 in(...) 里面成千上万的数据插入到临时表,再连表查询。

UP
[/Quote]
yes~

一般情况下,exists解决不了in的效率问题。
fwacky 2009-07-27
  • 打赏
  • 举报
回复

select * from tablename A
where exists (select 1 from tablename B wehre B.id = B.id and 你自己的条件 )


fwacky 2009-07-27
  • 打赏
  • 举报
回复


select * from tablename A
where exists (select 1 from tablename B wehre B.id = B.id )
renzhe02 2009-07-27
  • 打赏
  • 举报
回复
exists
left join
xiequan2 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lyw110 的回复:]
把 in(...) 里面成千上万的数据插入到临时表,再连表查询。
[/Quote]
up!
一般情况下连接算法效率比子查询要高很多
仙道彰 2009-07-27
  • 打赏
  • 举报
回复
exists
水族杰纶 2009-07-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lyw110 的回复:]
把 in(...) 里面成千上万的数据插入到临时表,再连表查询。
[/Quote]
UP
gjwang1983 2009-07-27
  • 打赏
  • 举报
回复
join
jwdream2008 2009-07-27
  • 打赏
  • 举报
回复
关注.......
Lyw110 2009-07-27
  • 打赏
  • 举报
回复
把 in(...) 里面成千上万的数据插入到临时表,再连表查询。
macchen1224 2009-07-27
  • 打赏
  • 举报
回复
exists,關注中。
--小F-- 2009-07-27
  • 打赏
  • 举报
回复
select * from table where exists(....)
you_tube 2009-07-27
  • 打赏
  • 举报
回复
left join
sdhdy 2009-07-27
  • 打赏
  • 举报
回复
exists
feixianxxx 2009-07-27
  • 打赏
  • 举报
回复
in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。

全文:
in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
in 与 =的区别
select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
的结果是相同的。

上面贴错了 不好意思
jinjazz 2009-07-27
  • 打赏
  • 举报
回复
where exists(子查询)
feixianxxx 2009-07-27
  • 打赏
  • 举报
回复
SQL Server 中对已经定义的变量赋值的方式用两种,分别是 SET 和 SELECT。对于这两种方式的区别,SQL Server 联机丛书中已经有详细的说明,但很多时候我们并没有注意,其实这两种方式还是有很多差别的。
SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值。当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法。
下表列出 SET 与 SELECT 的区别。请特别注意红色部分。
set select
同时对多个变量同时赋值 不支持 支持
表达式返回多个值时 出错 将返回的最后一个值赋给变量
表达式未返回值 变量被赋null值 变量保持原值
下面以具体示例来说明问题:
create table chinadba1(userid int ,addr varchar(128) )goinsert into chinadba1(userid,addr) values(1,'addr1')insert into chinadba1(userid,addr) values(2,'addr2')insert into chinadba1(userid,addr) values(3,'addr3')go
表达式返回多个值时,使用 SET 赋值
declare @addr varchar(128)set @addr = (select addr from chinadba1)/*--出错信息为服务器: 消息 512,级别 16,状态 1,行 2子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。*/go
表达式返回多个值时,使用 SELECT 赋值
declare @addr varchar(128)select @addr = addr from chinadba1print @addr --结果集中最后一个 addr 列的值--结果: addr3 go
表达式未返回值时,使用 SET 赋值
declare @addr varchar(128)set @addr = '初始值'set @addr = (select addr from chinadba1 where userid = 4 )print @addr --null值 go
表达式未返回值时,使用 SELECT 赋值
declare @addr varchar(128)set @addr = '初始值'select @addr = addr from chinadba1 where userid = 4print @addr --保持原值go
需要注意的是,SELECT 也可以将标量子查询的值赋给变量,如果标量子查询不返回值,则变量被置为 null 值。此时与 使用 SET 赋值是完全相同的对标量子查询的概念大家应该都觉得陌生,举个例子就能说明
declare @addr varchar(128)set @addr = '初始值'--select addr from chinadba1 where userid = 4 为标量子查询语句select @addr = (select addr from chinadba1 where userid = 4) print @addr --null值go

首先他们都可以给变量赋值,像给单个变量赋值时,如果不涉及到数据表操作,通常使用SET关键字,如果是多个变量赋值,并且这些值是从数据表中读取的情况下,一般都采用SELECT赋值

usher_gml 2009-07-27
  • 打赏
  • 举报
回复
EXISTS
加载更多回复(2)

22,298

社区成员

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

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