情况是这样的,比如有两个表 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多秒,实在是无法接受谢谢指点,虽然分不多
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 a.c1 from a
not exists
(
select b.c1 from b where a.c1=b.c2
)
order by a.c2
(select a.c1,a.c2 from a order by a.c2 /* #1
minus
selcet b.c1,b.c2 from b /* #2
)
order by c2
被减的记录里包含字段数据不确定,但a.c1这个字段是确定有的,所以,子查询里也只能有一个字段,b.c1
是不是楼主not exists时没有在关联列上建索引?a.c1和b.c2 。如果没建索引的话肯定就minus快了。
顺便问下楼主的数据量有多大?
我觉得下面的可以:
select * from
(select a.c1 from a
minus
selcet b.c1 from b )
order by a.c2
那就用exists,然后在关联列上建立普通索引。这样的话20000条记录性能上应该不成问题。如果数据不怎么变动,可以考虑用位图索引,那样速率会更快些。
本身minus不是推荐的方式。
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