求sql语句高手帮忙看下

丹青城 2013-08-21 03:16:54
在做一个在线考试系统,每个班级里面有多个学生,每次考试有多套试卷,这些试卷分配给多个班级。现在想根据学号让学生随机得到分配的试卷,怎么实现:

Users表 UserID ClassName 学生信息表

Paper_Class ID PaperID ClassID PaperName ClassName 试卷与班级分配结果表

想让学生根据学号随机得到所在班级分配试卷中的一套,求大神指教。。。。
...全文
154 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shawn 2013-08-22
  • 打赏
  • 举报
回复
引用 10 楼 danqingcheng 的回复:
这个可以满足一部分人分到试卷,但是问题是没有循环,如果一个班级只有2套试卷人有几十个,这里只有两个人能分到试卷。想让几十个人随机分到那2套中的一套,求如何修改,谢谢啦
--参考:
SELECT a.*,b.*
FROM 
(SELECT rowid=row_number() over(PARTITION BY ClassName order BY UserID), * from 学生信息表) a	--楼主还可以把这行里的order by改成order by newid(),随机性更强
LEFT JOIN
(SELECT rowid=row_number() over(PARTITION BY ClassName order BY NEWID()), cnt=COUNT(1) OVER(PARTITION BY Classname), * FROM 试卷与班级分配结果表) b
    ON a.ClassName = b.ClassName
        AND a.rowid % cnt + 1 = b.rowid
丹青城 2013-08-22
  • 打赏
  • 举报
回复
引用 9 楼 wwwwgou 的回复:
--假如在试卷与班级分配结果表中,每行记录代表一份试卷的话:
SELECT a.*,b.*
FROM 
(SELECT rowid=row_number() over(PARTITION BY ClassName order BY UserID), * from 学生信息表) a
LEFT JOIN
(SELECT rowid=row_number() over(PARTITION BY ClassName order BY NEWID()), * FROM 试卷与班级分配结果表) b
	ON a.ClassName = b.ClassName
		AND a.rowid = b.rowid
这个可以满足一部分人分到试卷,但是问题是没有循环,如果一个班级只有2套试卷人有几十个,这里只有两个人能分到试卷。想让几十个人随机分到那2套中的一套,求如何修改,谢谢啦
丹青城 2013-08-22
  • 打赏
  • 举报
回复
多谢shawn ,功能实现了,大神值得膜拜啊。。。
Shawn 2013-08-21
  • 打赏
  • 举报
回复
--假如在试卷与班级分配结果表中,每行记录代表一份试卷的话:
SELECT a.*,b.*
FROM 
(SELECT rowid=row_number() over(PARTITION BY ClassName order BY UserID), * from 学生信息表) a
LEFT JOIN
(SELECT rowid=row_number() over(PARTITION BY ClassName order BY NEWID()), * FROM 试卷与班级分配结果表) b
	ON a.ClassName = b.ClassName
		AND a.rowid = b.rowid
霜之哀伤额 2013-08-21
  • 打赏
  • 举报
回复
表函数的那个输出的表,要含有 UserID 和ID(试卷编号) ClassName的话你可以当做参数,传进去
霜之哀伤额 2013-08-21
  • 打赏
  • 举报
回复
1、 获取该班级随机的一份试卷 SELECT TOP 1 FROM Paper_Class WHERE ClassName = 'xxx' ORDER BY NEWID() 写表函数,循环Users,向表函数中的表添加记录,然后输出就行了 2、 另:如果你只想用一个SQL语句的话,那可能要用for xml path了
霜之哀伤额 2013-08-21
  • 打赏
  • 举报
回复
关联一下,然后order by new id
丹青城 2013-08-21
  • 打赏
  • 举报
回复
引用 3 楼 dotnetstudio 的回复:
将学生信息表和试卷与班级分配结果表进行笛卡尔积运算,然后去除掉班级名称不相等的记录,再每个学生取一条记录就OK了
能帮忙写下吗?
丹青城 2013-08-21
  • 打赏
  • 举报
回复
引用 2 楼 wwwwgou 的回复:
有两个问题: #1.每个班级的试卷类型,及试卷数量是如何分配的? #2.每个学生只能在自己班的试卷类型,有限的试卷数量中,随机分一张? 如果,全部是随机,试卷数量不限。就是说:我们现在有10类试卷,每个学生从中挑1套就行?
如何分配你就不用管了,分配的结果存在了Paper_Class表中,每个学生肯定是在分配到自己班级里面的试卷得到一份,学生按学号从中随机得到一套
KeepSayingNo 2013-08-21
  • 打赏
  • 举报
回复
将学生信息表和试卷与班级分配结果表进行笛卡尔积运算,然后去除掉班级名称不相等的记录,再每个学生取一条记录就OK了
Shawn 2013-08-21
  • 打赏
  • 举报
回复
有两个问题: #1.每个班级的试卷类型,及试卷数量是如何分配的? #2.每个学生只能在自己班的试卷类型,有限的试卷数量中,随机分一张? 如果,全部是随机,试卷数量不限。就是说:我们现在有10类试卷,每个学生从中挑1套就行?
lzw_0736 2013-08-21
  • 打赏
  • 举报
回复
最好附上數據示例,根據什麼數據,得到什麼數據

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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