语句:select * from tablea where pk_tablea in('pk1','pk2',.....,'pk1005') 括号中的值可能更多,oracle中好像in语句中表达式超过1000后就抛异常,能改成exists语句吗?高手帮忙.(我唯一能想到的是每次处理999条pk).

解决方案 »

  1.   

    改成exists也不见得有多大好转
      

  2.   

    不能用exists,只能改成其他的语句
      

  3.   

    可以的
    将in里面的值放在一个临时表中,再exists
      

  4.   

    你可以用一个变量来存放呀
    DECLARE @VAR VARCHAR(8000)
    SET @VAR=',pk1','pk2',.....,'pk1005,'
    SELECT * FROM TABLEA WHERE CHARINDEX(','+pk_tablea+',',@VAR)>0
      

  5.   

    select * from tablea 
    INNER JOIN (
    select 'pk1' as 'pk_tablea'
    union all select 'pk2'
    ...
    union all select 'pk1005'
    ) T ON TABLEA.pk_tablea=T.pk_tablea
      

  6.   

    建一张临时表,把 in() 后面的数据都放在临时表里,然后 select * from tablea t where exists(select 1 from # where pk_tablea=t.pk_tablea)
      

  7.   


    用这个试试
    select * from tablea where pk_tablea in (
    select 'pk'+cast(number as varchar(12)) from spt_values where number between 1 and 1005 and type='p'
    )
      

  8.   

    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还快一些
      

  9.   


    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 行受影响)
      

  10.   

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

  11.   

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

  12.   

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

  13.   

    1000个in了?这种条件下,用join的效率明显高得多