数据表:School[学校] 
字段: 
scId    编号 
scName  名称 数据表:Classes[班级] 
字段: 
clId        编号 
clSchoolId  所属学校编号 
clName      班级名称 数据表:Students[学生] 
字段: 
stId          编号 
stClassesId  所属班级编号 
stName        姓名 要求显示出 学生姓名班级名字学校名称里包含有“文”字的学校中按学校编号倒序排序的第5到第10个学校。 数据记录大至有50万+以上,所以对SQL优化的要求很高,作起来头痛死,有知道的兄弟帮帮忙吧。

解决方案 »

  1.   

    select top 5,,
     from AA where clSchoolId  
    not in(
    select top 5 clSchoolId  
      from ..
     where  like '%文%'
     and   clSchoolId  )
      

  2.   

    select scId,sName from
    (
    select sc.scId,sc.sName,select row_number()over (order by productname) as rownumber
    from School sc inner join Classes cl on sc.scId=cl.clSchoolId
    inner join Students st on st.stClassesId=cl.clId
    where sc.scName like '%文%' or cl.clName like '%文%' or st.stName like '%文%'
    order by scId desc
    ) as Result
    where rownumber between 5 and 10
      

  3.   


    如果符合条件的记录有10万条的话,会不会先生成一个10万记录的临时表Result,然后再取5-10呢?
      

  4.   

    呃,非常抱歉,忘了说平台了,我的MSSQL是2000,row_number()函数是MSSQL2005新增的,所有,没办法测试4楼的对不对了...
      

  5.   


    呵,老实说,没看懂你写的SQL句..
      

  6.   

    create view v_schoole
    as
    select school .* from school left join Classes on school.scId=clSchoolId  left join Students on stClassesId =clId        SELECT * FROM (SELECT TOP 5 * FROM (SELECT TOP 10 * from v_schoole ORDER BY scid DESC) AS T ORDER BY scid ASC) AS T1 ORDER BY scid DESC
      

  7.   

    一个学校里有多个班级,一个班级里有多个学生。
    如果A学校有十个符合条件的记录的话,这句SQL返回的学校将会是十行A学校的记录,而不是十个学校记录
    如果符合条件的记录有十万以上的话,估计会运行超时吧...
      

  8.   

    你不用ROW_NUMBER TOP只能说是最好的了。以前的分页还是用TOP呢
    把语句改成存储过程。可以解决超时问题。不会那么慢的。
      

  9.   

    select scId,sName from
    (
    select sc.scId,sc.sName,select row_number()over (order by productname) as rownumber
    from School sc inner join Classes cl on sc.scId=cl.clSchoolId
    inner join Students st on st.stClassesId=cl.clId
    where sc.scName like '%文%' or cl.clName like '%文%' or st.stName like '%文%'
    order by scId desc
    ) as Result
    where rownumber between 5 and 10
      

  10.   


    row_number()是MSSQL 2005的函数,我的数据库是MSSQL2000。
      

  11.   

    用临时表+2次top
    SELECT a.*,t.* into #tablea from Students a left join 
    (select * from Classes b left join School c on b.clSchoolId=c.scId )t 
    on a.stClassesId=t.clId  
    where charindex('文',a.stName)>0 and  charindex('文',t.clName)>0  and  charindex('文',t.scName)>0
     
    select top 5 from (select top 10 * from #table order by clSchoolId asc )t order by clSchoolId desc