我先说下我这个语句:
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 里面查询时间久很长了!
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 里面查询时间久很长了!
这个不是表,是从别的表里面查询的一个视图,V_1 ,这个视图就2个自动 一个ID, 一个CNAME。总共有900多条数据。
但是在 sql window 的查询结果和时间都很快,但是在report window 里面查询时间久很长了!
ID>0 group by s.cname) where ID>=3
这条语句不太懂
为什么where 中条件还可以通过ID来筛选
说句实话,楼主不要生气,这段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;
说说需求吧,这样比较靠谱
1.如果这个客户的ID 有一条记录信息大于3,则排除这个人,
2.如果所有的ID小于3或者大于0,然后再判断这个人的记录信息的ID 大于0小于3的数据条数大于3,排除这个客户(选择小于3的)
3.如果这个人的所有的ID 都是为0,则这个人是需要保留的人。
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的)
数据就出来了 。