• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

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

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

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

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

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

数据记录大至有50万+以上,所以对SQL优化的要求很高,作起来头痛死,有知道的兄弟帮帮忙吧。
...全文
201 点赞 收藏 26
写回复
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句..
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告