麻烦各位大侠在新年帮小弟解答一下。
祝各位新年愉快。问题如下有一个Staff 表 一个Organization表
SELECT *
  FROM Staff a where a.OrganizationID in  (40,60,45,51,1,3,4,5,6,7,7,8,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59) 请问如上SQL语句,如何改造,使得他的执行效率更高呢?
网上说用in 效率低,用exist 和left join代替该如何写好呢?

解决方案 »

  1.   

    这种语句就这样了,没办法优化了。
    a.OrganizationID 没有索引的话建一个索引吧。
      

  2.   


    SELECT *
      FROM Staff a where (a.OrganizationID between 1 and 60) and a.OrganizationID <> 2
                       a.OrganizationID <> 10 and a.OrganizationID <> 11--看到LZ的a.OrganizationID除了2、10、11外,其他都有,可以这么试试!
      

  3.   

    后面的条件每次都会不同的,像AcHerat写的话,程序生成就比较麻烦
      

  4.   

    select * from staff a 
    where a.OrganizationID not exist
    (select * from staff a where a.OrganizationID<>2 and a.OrganizationID<>10
    and a.OrganizationID<>11)
      

  5.   


    --1SELECT *
      FROM Staff a left join Organization b on a.OrganizationID = b.OrganizationID--2SELECT *
      FROM Staff a
      WHERE a.OrganizationID exists (select 1 from Organization b where a.OrganizationID = b.OrganizationID)
      

  6.   

    SELECT *
      FROM Staff a
      WHERE a.OrganizationID exists (select 1 from Organization b where a.OrganizationID = OrganizationID第二个多了个 b.
      

  7.   

    SELECT *
      FROM Staff where OrganizationID =1 or (OrganizationID>2 and OrganizationID<10) or(OrganizationID>11 and OrganizationID<61)
      

  8.   

    全部查出来可以,但是条件怎么加进去呢?
    SELECT *
      FROM Staff a left join Organization b on a.OrganizationID = b.OrganizationID or b.OrganizationID =1 or b.OrganizationID =2?
    这样吗 ? 
    在数据库里面执行全部staff的数据都出来了, 不仅仅是OrganizationID =1 或者2的
      

  9.   


    糊涂了,LZ,你如果是要找固定值的话!为什么还要在Organization表里找呢?要不带点数据说下吧!
      

  10.   

    ...把生成的一长串字符串分割插入到表中b 字段假设为col
    然后 
    select a.*
    FROM Staff a  join b on a.OrganizationID=b.col
      

  11.   

    按照我个人的意见,可以先建个临时表存储这些ID.然后再用exists,这样子的做法在ID比较多且,查询表的记录确实比较多的时候效果应该还不错的。
      

  12.   

    上次我也问过相同的问题,后来根据大家的建议,把那些具体的值插入到临时表,用EXISTS或者JOIN的方法,当量大的时候效果比IN好。