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

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

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

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

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

数据记录大至有50万+以上,所以对SQL优化的要求很高,作起来头痛死,有知道的兄弟帮帮忙吧。
...全文
351 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
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)

62,242

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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

试试用AI创作助手写篇文章吧