这样的in语句能改为exists语句吗?

王小胖重新学编程 2009-08-11 04:31:23
语句:select * from tablea where pk_tablea in('pk1','pk2',.....,'pk1005') 括号中的值可能更多,oracle中好像in语句中表达式超过1000后就抛异常,能改成exists语句吗?高手帮忙.(我唯一能想到的是每次处理999条pk).
...全文
239 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsd123 2009-08-11
  • 打赏
  • 举报
回复
.
幸运的意外 2009-08-11
  • 打赏
  • 举报
回复
可以把IN相关联的数据放到临时表中,然后再处理不知道可不可以。楼主试试吧。
htl258_Tony 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 libin_ftsafe 的回复:]
建一张临时表,把 in() 后面的数据都放在临时表里,然后

select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)
[/Quote]UP
batiraul 2009-08-11
  • 打赏
  • 举报
回复
1000个in了?

这种条件下,用join的效率明显高得多
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 soft_wsx 的回复:]
呵呵,看见问题是解决了,走了
[/Quote]
我在认真看每一个回帖呢,有些眉目了,谢谢各位高手...,我完全明白后结贴
华夏小卒 2009-08-11
  • 打赏
  • 举报
回复
可以看下我17楼的代码
soft_wsx 2009-08-11
  • 打赏
  • 举报
回复
呵呵,看见问题是解决了,走了
guguda2008 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 wangc4 的回复:]
引用 18 楼 sql77 的回复:
引用 15 楼 wangc4 的回复:
引用 8 楼 libin_ftsafe 的回复:
建一张临时表,把 in() 后面的数据都放在临时表里,然后

select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)

不好意思的说,我对临时表没操作过,该怎么定义,高手继续帮忙,而且我那些pk是已知的,该怎么存储,高手继续帮忙,我很菜

创建一个临时表呀CREATE TABLE #T(PKK VARCHAR(2000)),就存放你的那些,PK1,PK2.......

定义后直接用insert语句插入我的这些pk?
[/Quote]

建议你认真阅读每一个回帖
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 guguda2008 的回复:]
引用 20 楼 sql77 的回复:
引用 19 楼 guguda2008 的回复:
引用 15 楼 wangc4 的回复:
引用 8 楼 libin_ftsafe 的回复:
建一张临时表,把 in() 后面的数据都放在临时表里,然后

  select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)

不好意思的说,我对临时表没操作过,该怎么定义,高手继续帮忙,而且我那些pk是已知的,该怎么存储,高手继续帮忙,我很菜

最简单的办法就是建个新表,把已知的的PK插入新表,然后和目标表INNER JOIN
不想建表的话参考我7L的语句,不过原理是一样的。

宝鸭那么多,很难打了啦,直接用PK+自增来弄个临时表,很简单了

LZ没说一定是连续的,如果是连续的答案早就出来了
[/Quote]
没有没有,完全是随机生成的长度为20的pk,我只是为说明一下那么写的.不好意思,让大家误解了
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sql77 的回复:]
引用 15 楼 wangc4 的回复:
引用 8 楼 libin_ftsafe 的回复:
建一张临时表,把 in() 后面的数据都放在临时表里,然后

select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)

不好意思的说,我对临时表没操作过,该怎么定义,高手继续帮忙,而且我那些pk是已知的,该怎么存储,高手继续帮忙,我很菜

创建一个临时表呀CREATE TABLE #T(PKK VARCHAR(2000)),就存放你的那些,PK1,PK2.......
[/Quote]
定义后直接用insert语句插入我的这些pk?
guguda2008 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 sql77 的回复:]
引用 19 楼 guguda2008 的回复:
引用 15 楼 wangc4 的回复:
引用 8 楼 libin_ftsafe 的回复:
建一张临时表,把 in() 后面的数据都放在临时表里,然后

  select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)

不好意思的说,我对临时表没操作过,该怎么定义,高手继续帮忙,而且我那些pk是已知的,该怎么存储,高手继续帮忙,我很菜

最简单的办法就是建个新表,把已知的的PK插入新表,然后和目标表INNER JOIN
不想建表的话参考我7L的语句,不过原理是一样的。

宝鸭那么多,很难打了啦,直接用PK+自增来弄个临时表,很简单了
[/Quote]
LZ没说一定是连续的,如果是连续的答案早就出来了
SQL77 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 guguda2008 的回复:]
引用 15 楼 wangc4 的回复:
引用 8 楼 libin_ftsafe 的回复:
建一张临时表,把 in() 后面的数据都放在临时表里,然后

  select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)

不好意思的说,我对临时表没操作过,该怎么定义,高手继续帮忙,而且我那些pk是已知的,该怎么存储,高手继续帮忙,我很菜

最简单的办法就是建个新表,把已知的的PK插入新表,然后和目标表INNER JOIN
不想建表的话参考我7L的语句,不过原理是一样的。
[/Quote]
宝鸭那么多,很难打了啦,直接用PK+自增来弄个临时表,很简单了
guguda2008 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wangc4 的回复:]
引用 8 楼 libin_ftsafe 的回复:
建一张临时表,把 in() 后面的数据都放在临时表里,然后

select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)

不好意思的说,我对临时表没操作过,该怎么定义,高手继续帮忙,而且我那些pk是已知的,该怎么存储,高手继续帮忙,我很菜
[/Quote]
最简单的办法就是建个新表,把已知的的PK插入新表,然后和目标表INNER JOIN
不想建表的话参考我7L的语句,不过原理是一样的。
SQL77 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wangc4 的回复:]
引用 8 楼 libin_ftsafe 的回复:
建一张临时表,把 in() 后面的数据都放在临时表里,然后

select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)

不好意思的说,我对临时表没操作过,该怎么定义,高手继续帮忙,而且我那些pk是已知的,该怎么存储,高手继续帮忙,我很菜
[/Quote]
创建一个临时表呀CREATE TABLE #T(PKK VARCHAR(2000)),就存放你的那些,PK1,PK2.......
华夏小卒 2009-08-11
  • 打赏
  • 举报
回复

declare @tablea table(CID int, pk_tablea varchar(12))
insert @tablea select
2 , 'pk1' union all select
3 , 'pk2' union all select
4 , 'pk11' union all select
5 , 'pk11111' union all select
6 , 'pk112' union all select
7 , 'pk1212' union all select
8 , 'pk3' union all select
9 , 'pk4' union all select
10 , 'pk5' union all select
11 , 'pk6' union all select
12 , 'pk7' union all select
13 , '小明'



select * from @tablea where pk_tablea in (
select 'pk'+cast(number as varchar(12)) from [master].[dbo].[spt_values] where number between 1 and 1005 and type='p'
)

CID pk_tablea
----------- ------------
2 pk1
3 pk2
4 pk11
6 pk112
8 pk3
9 pk4
10 pk5
11 pk6
12 pk7

(9 行受影响)
guguda2008 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jinfengyiye 的回复:]
引用 12 楼 xiequan2 的回复:
SQL codedeclare@ttable(pkvarchar(50))insertinto@tselect'pk1'unionallselect'pk2'unionallselect'pk3'unionallselect'pk4'unionallselect'pk5'select*from tablea twhereexists (select1from@twhere pk_tablea=t.¡­

学习
[/Quote]
这样写还不如写成我在7L写的那样呢
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 libin_ftsafe 的回复:]
建一张临时表,把 in() 后面的数据都放在临时表里,然后

select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)
[/Quote]
不好意思的说,我对临时表没操作过,该怎么定义,高手继续帮忙,而且我那些pk是已知的,该怎么存储,高手继续帮忙,我很菜
gw6328 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiequan2 的回复:]
SQL codedeclare@ttable(pkvarchar(50))insertinto@tselect'pk1'unionallselect'pk2'unionallselect'pk3'unionallselect'pk4'unionallselect'pk5'select*from tablea twhereexists (select1from@twhere pk_tablea=t.¡­
[/Quote]
学习
SQL77 2009-08-11
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 libin_ftsafe 的回复:]
建一张临时表,把 in() 后面的数据都放在临时表里,然后

select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)
[/Quote]
支持钻钻的,先放临时表,再进行连接,速度应该很快了
xiequan2 2009-08-11
  • 打赏
  • 举报
回复
declare @t table(pk varchar(50))

insert into @t
select 'pk1' union all
select 'pk2' union all
select 'pk3' union all
select 'pk4' union all
select 'pk5'


select * from tablea t where exists (select 1 from @t where pk_tablea=t.pk)

其实这种改成

select * from tablea t1 join @t t2 on t1. pk_tablea=t2.pk还快一些
加载更多回复(11)

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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