日期:2014-05-17  浏览次数:21107 次

minus操作后的排序,请大侠指点。
情况是这样的,比如有两个表 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多秒,实在是无法接受

谢谢指点,虽然分不多


------解决方案--------------------
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
------解决方案--------------------
怎么会minus比not exists的相关子查询速度还快呢?前者首先要对两个表进行sort排序,这是比较耗费性能的。
是不是楼主not exists时没有在关联列上建索引?a.c1和b.c2 。如果没建索引的话肯定就minus快了。
顺便问下楼主的数据量有多大?
------解决方案--------------------
我觉得快慢最好使用工具监视一下资源使用情况即可看出结果。
我觉得下面的可以:
select * from
(select a.c1 from a
minus
selcet b.c1 from b ) 
order by a.c2


------解决方案--------------------
SQL code

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