一对多数据表联合搜索的问题

离子漂浮物 2009-05-12 08:10:02
数据表:School[学校]
字段:
scId 编号
scName 名称

数据表:Classes[班级]
字段:
clId 编号
clSchoolId 所属学校编号
clName 班级名称

数据表:Students[学生]
字段:
stId 编号
stClassesId 所属班级编号
stName 姓名

要求显示出 学生姓名班级名字学校名称里包含有“文”字的学校中按学校编号倒序排序的第5到第10个学校。

数据记录大至有50万+以上,所以对SQL优化的要求很高,作起来头痛死,有知道的兄弟帮帮忙吧。
...全文
261 26 打赏 收藏 举报
写回复
26 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
mengxj85 2009-05-21
[Quote=引用 17 楼 oyiboy 的回复:]
引用 16 楼 jidianxueyuan 的回复:
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 bet…
[/Quote]
利用临时表,加一列自动编号的列就可以了
  • 打赏
  • 举报
回复
springbell 2009-05-21
顶个
  • 打赏
  • 举报
回复
redhat2 2009-05-18
关注

.



人力资源
  • 打赏
  • 举报
回复
makun0624 2009-05-16
学习`关注`UP
  • 打赏
  • 举报
回复
zzxap 2009-05-14

[code=SQL]
用临时表+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

[/CODE]

  • 打赏
  • 举报
回复
沉序员 2009-05-14
顶一下,
  • 打赏
  • 举报
回复
离子漂浮物 2009-05-14
如果第五到第十个的学校是同一个学校,那不出来的都是五个一样的学校了?
  • 打赏
  • 举报
回复
离子漂浮物 2009-05-14
[Quote=引用 19 楼 zzxap 的回复:]


SQL code
用临时表+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
[/Quote]


如果第五到第六个的学校是同一个学校,那不出来的都是五个一样的学校了?
  • 打赏
  • 举报
回复
陌上花花 2009-05-13
帮顶了
  • 打赏
  • 举报
回复
离子漂浮物 2009-05-13
[Quote=引用 12 楼 wuyq11 的回复:]
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
[/Quote]


一个学校里有多个班级,一个班级里有多个学生。
如果A学校有十个符合条件的记录的话,这句SQL返回的学校将会是十行A学校的记录,而不是十个学校记录
如果符合条件的记录有十万以上的话,估计会运行超时吧...
  • 打赏
  • 举报
回复
离子漂浮物 2009-05-13
[Quote=引用 16 楼 jidianxueyuan 的回复:]
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
[/Quote]

row_number()是MSSQL 2005的函数,我的数据库是MSSQL2000。
  • 打赏
  • 举报
回复
jidianxueyuan 2009-05-13
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
  • 打赏
  • 举报
回复
sayoath 2009-05-13
你不用ROW_NUMBER TOP只能说是最好的了。以前的分页还是用TOP呢


把语句改成存储过程。可以解决超时问题。不会那么慢的。
  • 打赏
  • 举报
回复
llsen 2009-05-12
[Quote=引用 12 楼 wuyq11 的回复:]
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
[/Quote]

这个顺序反了,是按从10到6的顺序
  • 打赏
  • 举报
回复
wuyq11 2009-05-12
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
  • 打赏
  • 举报
回复
离子漂浮物 2009-05-12
[Quote=引用 8 楼 yangqidong 的回复:]
会啊。
[/Quote]

那..不是会很慢很慢??..
  • 打赏
  • 举报
回复
pl1069 2009-05-12
请用sql2000写
  • 打赏
  • 举报
回复
xudongdong1990 2009-05-12
挺复杂的啊,帮顶了
  • 打赏
  • 举报
回复
yangqidong 2009-05-12
会啊。
  • 打赏
  • 举报
回复
离子漂浮物 2009-05-12
[Quote=引用 3 楼 llsen 的回复:]
写的有点乱
时间不够了

就是加上你的条件
然后出去前五名后的前五名,就是6-10位,不过这样效率可能有点低
你这么大的数据量
[/Quote]

呵,老实说,没看懂你写的SQL句..
  • 打赏
  • 举报
回复
加载更多回复(6)
相关推荐
发帖
.NET社区

6.0w+

社区成员

.NET技术交流专区
社区管理员
  • ASP.NET
  • R小R
  • 喵叔哟
加入社区
帖子事件
创建了帖子
2009-05-12 08:10
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。