s_name表  
  id number(11) NOT NULL, 
  name nvarchar2(40) NOT NULL, /*名称*/ 
  desc nvarchar2(255) NULL, /*描述*/ 
  PRIMARY KEY (id) 
b_name表
  id number(11) not null,
  name 名称 NVARCHAR2(100) /*名称*/
  PRIMARY KEY (id)
s_name表记录:
  id      name    desc
   1      A       A大类
   2      B       B大类
   3      C       C大类
   4      A1      A小类
   5      A2      A小类
   6      C1      C小类
b_name表记录:
  id      name
   1      A3465431
   2      Aljiou
   3      Bipoi08
   4      B2egdfgdfg
   5      C22222
按以上表,我现在要根据s_name的所有记录对b_name按类别统计
因统计中需用到like,所以小弟用了循环,先将s_name表读出来,再对b_name表进行循环查询。
如果b_name表有百万条记录,那查询要好几分钟时间
小弟在此求优化,希望可以使用group by或更好方法解决
解决立即给分,急!!!

解决方案 »

  1.   

    b_name表设计不好。现在查大类的:
    select * from 
    (
      select id,substring(name,1,1) as type ,name from b_name
    ) b
    join  s_name s on a.type = s.namewhere 你的条件建议你的b_name表改为:
    ID    typeId  name 1     1    A3465431  
    其中typeId为s_name表中对应的类别ID。
      

  2.   

    s_name表是用户自定义的,可以修改、添加、删除,所以这样b_name表就算有typeId字段也没用啊
      

  3.   

    liuyxit(苦涩的咖啡) :好像不行啊,substring(name,1,1)只取出第一个字符,如果是多个字符就不行了
      

  4.   

    怎么就没人回答了,用group by方法已试出了,
    select count(b.id),s.name from b_name b,s_name s where b.name like concat(s.name,'%') group by s.name;
    但时间还是很慢,
    b_name表有40多万条记录,s_name表有15条记录,每查一次b_name表就要12秒左右,整条语句的执行时间是12*15=180秒,跟循环差不多。
    大家帮忙想想啊,还有什么方法,像二楼那种join的方法可以优化很多,但他那条sql语句不适合大小类一起统计啊。我忘了提出要求,在统计大类的时候要连小类一起统计,统计小类的时候才单独统计。上面那条group by语句的统计结果是对的.小弟已经想了一整天了,高手们帮帮啊,谢谢了