情况是这样的,比如有两个表 a和b 结构如下
a:c1    c2   c3
abc   1    3
...   ...  ...
b:c1   c2   c3
abc   a    b
...   ...  ...
其中,a.c1和b.c1是两相关联字段。
我自己曾经用过一个SQL如下:
select a.c1 from a 
not exists
(
select b.c1 from b
)
order by a.c2
我要的就是上面的效果,但是效率很低,没有使用价值,我想用minus
如用
select a.c1 from a order by a.c2        /* #1
minus
selcet b.c1 from b                     /* #2
这样的效率高很多,但是却丢失了原来的排序信息,,有什么办法能保证#1语句的排序信息?
或者用其它的方法实现,但效率比用exists 高,用exists查询一次要50多秒,实在是无法接受谢谢指点,虽然分不多

解决方案 »

  1.   

    上面的SQL写错了,应该是这样的
    select   a.c1   from   a   
    not   exists 

    select   b.c1   from   b where a.c1=b.c2

    order   by   a.c2 
      

  2.   

    select * from 
    (select   a.c1,a.c2   from   a   order   by   a.c2                 /*   #1 
    minus 
    selcet   b.c1,b.c2   from   b                                           /*   #2
    )
    order by c2
      

  3.   

    谢谢两位。但有个条件。
    被减的记录里包含字段数据不确定,但a.c1这个字段是确定有的,所以,子查询里也只能有一个字段,b.c1
      

  4.   

    怎么会minus比not exists的相关子查询速度还快呢?前者首先要对两个表进行sort排序,这是比较耗费性能的。
    是不是楼主not exists时没有在关联列上建索引?a.c1和b.c2 。如果没建索引的话肯定就minus快了。
    顺便问下楼主的数据量有多大?
      

  5.   

     to:advanceadvice 确实没有建索引,直接操作,数据量也不大,最多不超过20,000吧
      

  6.   

    我觉得快慢最好使用工具监视一下资源使用情况即可看出结果。
    我觉得下面的可以:
    select   *   from   
    (select   a.c1 from     a                                     
    minus   
    selcet  b.c1 from b  ) 
    order   by   a.c2
      

  7.   

    [to:advanceadvice   确实没有建索引,直接操作,数据量也不大,最多不超过20,000吧]
    那就用exists,然后在关联列上建立普通索引。这样的话20000条记录性能上应该不成问题。如果数据不怎么变动,可以考虑用位图索引,那样速率会更快些。
    本身minus不是推荐的方式。
      

  8.   


    select   *   from   
    (select       a.c1,a.c2       from       a       order       by       a.c2                                   /*       #1   
    minus   
    selcet       b.c1,b.c2       from       b                                                                                       /*       #2 

    order   by   c2----------------------------------------
    这种方法是错误的,和楼主的SQL并不是完全等同的楼主的可以通过外连接来实现select a.c1 from a,b
    where a.c1=b.c1(+)
    and b.c1 is null