表结构:
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语句。

解决方案 »

  1.   

    select a.AAC001,a.AAE202,a.AAE100
              from a
              where nvl(a.AKC032,' ')=' ' and nvl(a.AAE202,' ')<>' ' and exists
               (selet 1 from b where a.AAC001=b.AAC001)    
      

  2.   

    说明一下,某些 AAC001 数据在表A中是有的,在表B中也可能存在,要查找的的AAC001是表A和表B两者的合集
      

  3.   

    楼主前面写的要求与后面的SQL不符合哦。需求: 
    查找出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)
      

  4.   

    不明白你的思路,你的条件是FROM A where AAC001 in (),就是取a表的数据,你的子查询里union再多的表,最终也是取a表的数据呀。
    SELECT a.AAC001 FROM A,b  where a.AAE202 is not null and a.AKC032 is null 
    and a.AAC001 = b.AAC001 
      

  5.   

    呵呵,我没表达好引起了误会,向各位高手说声对不起。需求: 
    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表。
      

  6.   

    写错了。
    AAC001虽然是在A表中是全部都有的,但是有了a.AAC001 = b.AAC001这个条件后,是得不出有效的结果的 
    因为A表和B表两者的交集就是B表。
      

  7.   


    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  
      

  8.   

    select a.AAC001,a.AAE202,a.AAE100 FROM A 
    WHERE AAE202 is not null and AKC032 is null  AND EXISTS
    (SELECT 1 FROM B WHERE A.AAC001=B.AAC001)風一樣的男子应该是对的。
      

  9.   

     关注,这个union可以跟很多使用的
      

  10.   

    需求: 
    查找出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)
      

  11.   

    楼上的说对了,我之前没表达好
    天天对电脑久了,话也不会说了,怀念大学的时光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秒左右,不过我还是对这个结果不太满意,哪位兄弟能给个可行的优化办法。
      

  12.   

    exists要有索引的时候,才能大幅度提高效率b的aac001应该加索引
    a的akc032和aae202哪个能大量过滤数据的话,也应加上索引