分页查询的 Tb_Trans表(主表) 要查询出的数据列ItemName,ItemId
Tb_Item 表(次表) 要查询的关联列 ItemName(别名 PPName),DistId 要求过滤 主表Tb_Trans中的相同ItemName列且不为空,主表Tb_Trans 中的DistId不为空且在 次表Tb_Item 中DistId字段对应,下面是我写的sql,功能倒是满足,但性能有点慢,我是在20W数据中抓的发现从第一页到第二页用时20秒,望前辈们指点
select * from(select a.ItemName,a.ItemId,c.ItemName as PPName,d.distId from Tb_Trans a 
                                         left join tb_item c on c.ItemId=a.ItemId 
                                         inner join tb_Item d on d.distId=a.distId 
                                         where a.ItemName is not null and d.distId is not null 
  group by a.ItemName,a.ItemId,c.ItemName,d.distId) 
                                         where rownum<=80  
                                         minus 
                                         select * from(select a.ItemName,a.ItemId,c.ItemName as PPName,d.distId from Tb_Trans a 
                                         left join tb_item c on c.ItemId=a.ItemId 
                                         inner join tb_Item d on d.distid=a.distId 
                                         where a.ItemName is not null and d.distId is not null 
 group by a.ItemName,a.ItemId,c.ItemName,d.distId) 
                                         where rownum<=60 

解决方案 »

  1.   

    select * 
    FROM
    (
    select 
    a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName)  AS row
    from Tb_Trans a 
         left join tb_item c on c.ItemId=a.ItemId 
         inner join tb_Item d on d.distId=a.distId 
         where a.ItemName is not null and d.distId is not null 
      group by a.ItemName,a.ItemId,c.ItemName,d.distId
      ) t
      WHERE row BETWEEN 61 AND 80
      

  2.   


    谢谢前辈,但是我想如果一用到分组group by 的话基本就要慢好多,但是不分组用distinct好像不支持多列,也不知道有什么好方法吗?
      

  3.   

    用distinct后再分頁這樣用,建議直接用group byselect *,ROW_NUMBER()OVER(ORDER BY a.ItemName) AS row
    from (select distinct col2,col3 from tablename)t
      

  4.   

    Distinct--保留順序
    group by --會改變順序
      

  5.   

    提示樓主,貼子別亂轉啊剛才SQL Server ,現在又是.NET
      

  6.   

    谢谢,呵呵,我知道asp.net 版块人气旺,所以... ,我是拿20W那张表的做测试的发现很慢的,还有张100W的都不知道我的电脑抗不抗的住
      

  7.   

    select ItemName,ItemId,PPName,distId 
    FROM
    (
    select 
        a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName)  AS row
    from Tb_Trans a 
         left join tb_item c on c.ItemId=a.ItemId 
         inner join tb_Item d on d.distId=a.distId 
         where a.ItemName is not null and d.distId is not null 
      group by a.ItemName,a.ItemId,c.ItemName,d.distId
      ) t
      WHERE row BETWEEN 61 AND 80這樣用,你試試
      

  8.   

    我知道那是页索引的,可是加上as row 后就报“未找到要求的from关键字”错误,去掉 as row 就不报错了,但是一样很慢,比我原来写的还慢啊
      

  9.   

    沒Oracle環境,改一下別名試試select ItemName,ItemId,PPName,distId 
    FROM
    (
    select 
        a.ItemName,a.ItemId,c.ItemName as PPName,d.distId,ROW_NUMBER()OVER(ORDER BY a.ItemName)  AS Num
    from Tb_Trans a 
         left join tb_item c on c.ItemId=a.ItemId 
         inner join tb_Item d on d.distId=a.distId 
         where a.ItemName is not null and d.distId is not null 
      group by a.ItemName,a.ItemId,c.ItemName,d.distId
      ) t
      WHERE Num BETWEEN 61 AND 80
      

  10.   

    前辈,这个先不讨论,如果对于这样的查询在sqlserver中有什么好的优化方法吗?该用索引的我也用了,在该成存储过程,还有别的方面东西能介绍介绍吗?今天是第一次碰到大量数据几张表组合查询的
      

  11.   

    可能是left join 跟is net null引起的你把left 去掉 直接用join把is not null这个条件去掉看会不会快起来,如果是,问题就出在这了·看看有什么办法代替left join,或其它的方法