1 select t.res_man_id,t.apply_man_id,t.ctrl_man_id,t.........  from  warehouse t ,t_userIdName  u 
  
  select (select u.name from t_userIdName u where u.id=t.res_man_id ) as res_man_name,
         ..............
         (select u.name from t_userIdName u where u.id=t.repair_man_id ) as repair_man_name ,
             
  大家看字段就明白了,XX_man_id,都来自于t_userId 如何最有效率的从 warehouse 表的记录里,将_id 转换成 name ?我总不能用N个字查询吧?
2    select  t1.XX, ....,t1.YY, t2.XX, ....,t2.YY,t3.XX, ....,t3.YY..........     from 表1,表2,表3,表4.... 
     where t1.xxx=t2.yyy and t3.xxx = t4.yyy .......
     从 t1.xx 到tn.yy 就是我们想要的结果字段。 但是这个些结果字段来自于不同的表,同时这些表之间存在某种关系连接在一起。  对于这种情况。  要如何优化这些查询。3 from 表1,表2,表3,表4,...... 这种写法是不是效率不好, 用 from t1 left join t2 on t1.mainId=t2.mainid .....
是不是用连接查询要比那种的好?
谢谢大家!
 

解决方案 »

  1.   

    1.没办法,嫌sql麻烦,直接弄个视图。以后从视图查,就不用写那么多次了。
    2.只能说加索引能加快速度。不管是from,还是left join,都是笛卡儿然后能过滤最多数据的条件放where最后,数据量最小的表放from最后个人意见,仅供参考
      

  2.   

    补充问题:比如说:我们经常像 按类别统计一些数据,同时又想在结果里面,包含某些字段select id,country_name,..........,count(字段1) as c1  from xxxx k group by type 
    大家知道 select t.f1, count(t.f9) from  t 这样的语句是不行的,f2是单行数据,f1可能是多少数据。
    但是我又需要f1字段。
             select t.f1,count(t.f9) from t group by t.f1;
    如果我同时需要保留很多字段呢?select t.f1,t.f2,t.f3.t.f4.t.f5..... count(t.f9) from t group by t.f1,t.f2,t.f3,t.f4.....  
    这样group by 这么多字段,效率肯定有问题。有没有什么好办法啊?
      

  3.   


       是啊!哪会有N个查询啊!    能过滤最多数据的条件放where最后,数据量最小的表放from最后  这两点都是RBO法则吧!现在11g是基于CBO哦!
      

  4.   

    对于:1 select t.res_man_id,t.apply_man_id,t.ctrl_man_id,t.........  from  warehouse t ,t_userIdName  u 我能不能一次性把name全部查出来啊,然后再拼接到 结果中去啊? 比如: 
      

  5.   

    这个我一般先count,用id+count得到一个子查询集,然后再根据id去关联。