我先说下我这个语句:
select max(ID) ,cname  from  V_1  v  group by v.cname having max(ID) <=3 
这个语句查询的一个视图,这个视图有960条数据,查询时间是2秒。
select cname from(  select count(s.ID),s.cname from V_1  s  where
  ID>0 group by s.cname) where ID>=3
这个也是查询一这个视图,查询时间是2.3秒。数据是350 行,
但是按下面的查询方式查询,需要时间在半个小时以上。select max(ID) ,cname  from  V_1  v  group by v.cname having max(ID) <=3 and
not exists (
 select cname from(  select count(s.ID),s.cname from V_1  s  where
  ID>0 group by s.cname) where ID>=3  and  v.cname=s.cname
)求高人指点。
顺便说下上面的查询是在sql window 的查询结果和时间,但是在report window 里面查询时间久很长了!

解决方案 »

  1.   


    这个不是表,是从别的表里面查询的一个视图,V_1  ,这个视图就2个自动 一个ID, 一个CNAME。总共有900多条数据。
    但是在 sql window 的查询结果和时间都很快,但是在report window 里面查询时间久很长了!
      

  2.   

    select cname from( select count(s.ID),s.cname from V_1 s where
      ID>0 group by s.cname) where ID>=3
    这条语句不太懂 
    为什么where 中条件还可以通过ID来筛选
      

  3.   


    说句实话,楼主不要生气,这段SQL逻辑很混乱,没有什么优化的价值,实在是没法理解这句SQL的思路。楼主还是把需求提出来,大家帮你写条新的SQL好了。
    -- 假设楼主是要找最大ID小于3,并且ID大于0的记录数量也小于3的cname
    SELECT MAX(ID),CNAME 
    FROM V_1 
    GROUP BY CNAME 
    HAVING MAX(ID) < 3
    AND SUM(CASE WHEN ID > 0 THEN 1 ELSE 0 END) < 3; 
      

  4.   

    lz自己撰的这句SQL太高深了,我愣是没看明白,至于优化就无从下手了。
    说说需求吧,这样比较靠谱
      

  5.   

    需求是这样的,一个人有很多条记录信息,ID  name,要统计的是这个客户:
    1.如果这个客户的ID 有一条记录信息大于3,则排除这个人,
    2.如果所有的ID小于3或者大于0,然后再判断这个人的记录信息的ID 大于0小于3的数据条数大于3,排除这个客户(选择小于3的)
    3.如果这个人的所有的ID 都是为0,则这个人是需要保留的人。
      

  6.   

    不知道理解了lz的需求没有
    SELECT   COUNT (s.ID), s.cname
      FROM   V_1 s
     WHERE       ID >= 0--如果这个人的所有的ID 都是为0,则这个人是需要保留的人。
             AND id < 3
             AND NOT EXISTS (SELECT   1
                               FROM   V_1 v
                              WHERE   v.cname = s.cname AND v.id > 3)--如果这个客户的ID 有一条记录信息大于3,则排除这个人
    HAVING   COUNT (s.ID) < 3--如果所有的ID小于3或者大于0,然后再判断这个人的记录信息的ID 大于0小于3的数据条数大于3,排除这个客户(选择小于3的)
      

  7.   

    这样查的结果是不对的,不过还是谢谢你,你的代码给我参考,后来我把这个修改成先把ID大于3的客户过滤掉,在用这个客户和那个次数小于3的客户表inner join ,最后在和ID=0 的客户union 。
    数据就出来了 。