解决方案 »

  1.   


    select *
      from tab1 e
     where exists (select 1
              from tab2 pp
             where (e.id = pp.id or e.master_id = pp.id)
               and pp.type = '1');
      

  2.   

    这个逻辑比较复杂,语句上难以优化
    1楼的结果集会多出一部分,即存在e.master_id=pp.id and pp.type=1,但是同时存在e.id=pp.id(这几条记录都不满足pp.type=1) 这个部分
      

  3.   

    不优化的话我想改成连接查询  inner join  + left join 怎么最好  谢谢
      

  4.   

    难以直接连接,两表存在1对多的关系,且有exists和not exists的关系,直接连接的结果可能会和原语句差别很大
    为什么需要优化呢,如果是查询缓慢的话,提供下执行计划
      

  5.   

    可以改成join,然后用where的xx is null这些来实现not exists逻辑
      

  6.   

    不能随意改成join方式,向楼上上说的要注意表之间的数据关系(一对多)。
      

  7.   

    个人感觉。
    把2楼的句子括号里面和外边都可以全部改成inner join,不过效率应该不会很好的。
      

  8.   

    可以试试这样,到最后如果需要去重就去重一下就好了,我现在改成了in,如果你有需要可以改成inner join,不过这样并不能保证速度一定加快,如果真需要优化,还是要有执行计划的。
    SELECT *
      FROM tab1 e
     WHERE e.id IN (SELECT pp.id FROM tab2 pp WHERE pp.type = '1')
    UNION ALL
    SELECT *
      FROM tab1 e
     WHERE e.master_id IN (SELECT ppid FROM tab2 pp WHERE pp.type = '1')
      

  9.   

    query plan出了之后再寻求优化. 否则容易了偏