表结构:
A表
ID AAC001 AAE202 AAE100 AKC032B表
ID AAC001 SNUMBER需求:
查找出A表中AKC032为NULL,AAE202不为NULL并且在B表中也存在的AAC001现有SQL语句:
CREATE OR REPLACE VIEW BATCH2 AS
SELECT AAC001, AAE202, AAE100 FROM A
where AAC001 in
(
SELECT a.AAC001 FROM A a where a.AAE202 is not null and a.AKC032 is null
UNION ALL
select b.AAC001 FROM B b
)
查找这个视图中数据的时候,要10来秒时间才出现结果
据说在SQL语句中,出现IN 和 UNION ALL 是很低效的,求高手给一个优化的SQL语句。
A表
ID AAC001 AAE202 AAE100 AKC032B表
ID AAC001 SNUMBER需求:
查找出A表中AKC032为NULL,AAE202不为NULL并且在B表中也存在的AAC001现有SQL语句:
CREATE OR REPLACE VIEW BATCH2 AS
SELECT AAC001, AAE202, AAE100 FROM A
where AAC001 in
(
SELECT a.AAC001 FROM A a where a.AAE202 is not null and a.AKC032 is null
UNION ALL
select b.AAC001 FROM B b
)
查找这个视图中数据的时候,要10来秒时间才出现结果
据说在SQL语句中,出现IN 和 UNION ALL 是很低效的,求高手给一个优化的SQL语句。
from a
where nvl(a.AKC032,' ')=' ' and nvl(a.AAE202,' ')<>' ' and exists
(selet 1 from b where a.AAC001=b.AAC001)
查找出A表中AKC032为NULL,AAE202不为NULL并且在B表中也存在的AAC001 如果是这个要求,那么SQL很简单
select a.aac001 from a where akc032 is null and aae202 is not null and exist(select 1 from b where b.aac001=a.aac001)
SELECT a.AAC001 FROM A,b where a.AAE202 is not null and a.AKC032 is null
and a.AAC001 = b.AAC001
A表中有上百万条记录,要求先查询出A表中AKC032为NULL,AAE202不为NULL的AAC001出来,
然后再从B表(少于一万条记录)中查出所有AAC001出来,
最后把两者查出来的AAC001放一块,就是我要的结果了。
其实整个B表的AAC001在A表中是全部存在的,但是有条件限制AKC032为NULL,AAE202不为NULL后A表中的AAC001
在B表中就找不到了,所以我才会写出有 UNION ALL的SQL语句来。
建立这个视图后,查询这个视图的数据需要10秒甚至更长的时间,故想优化下建视图的SQL语句。 Robin你说不明白你的思路,你的条件是FROM A where AAC001 in (),就是取a表的数据,你的子查询里union再多的表,最终也是取a表的数据呀。 AAC001虽然是在AAC001中是全部都有的,但是有了a.AAC001 = b.AAC001这个条件后,是得不出有效的结果的
因为A表和B表两者的交集就是B表。
AAC001虽然是在A表中是全部都有的,但是有了a.AAC001 = b.AAC001这个条件后,是得不出有效的结果的
因为A表和B表两者的交集就是B表。
SELECT AAC001, AAE202, AAE100 FROM A where AAE202 is not null and AKC032 is null
union all
SELECT a.AAC001, a.AAE202, a.AAE100 FROM A,b where a.AAC001 = b.AAC001
WHERE AAE202 is not null and AKC032 is null AND EXISTS
(SELECT 1 FROM B WHERE A.AAC001=B.AAC001)風一樣的男子应该是对的。
查找出A表中AKC032为NULL,AAE202不为NULL,并且在B表中也存在的AAC001
应该是或者吧
楼主说的交集,是不是就是并集select a.* from a where akc032 is null and aae202 is not null
or exist(select 1 from b where b.aac001=a.aac001)
天天对电脑久了,话也不会说了,怀念大学的时光select a.* from a where akc032 is null and aae202 is not null
or exists(select 1 from b where b.aac001=a.aac001)
这个语句效果和我给的SQL结果一致,但是性能好像提高不大,可能客户原来的表设计上有不恰当的地方表A大概有30个字段,上百万条记录,B表是我设计的一个记录表只有4个字段,用来存储一些临时信息,正常大概是5000条 记录,这些数据是不断添加进来,用完后又给删除掉了现在第一次查询结果的时候需要10至30秒,再次查询的时候由于ORACLE自带的高速缓存功能
将查询时间缩短到了1到3秒左右,不过我还是对这个结果不太满意,哪位兄弟能给个可行的优化办法。
a的akc032和aae202哪个能大量过滤数据的话,也应加上索引