首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

不一般的随机抽取试题SQL语句解决办法

2012-02-02 
不一般的随机抽取试题SQL语句大虾们好有个疑难问题我要做个考试的东西要随机抽取试题,但是题库里是有相似

不一般的随机抽取试题SQL语句
大虾们好
有个疑难问题
我要做个考试的东西
要随机抽取试题,但是题库里是有相似题目的,比如题库里有4、5道题考正弦定理
有什么办法保证抽题的时候不会把抽出2道以上相似题目在一张试卷呢?

我的做法是给每道题目加个描述,相似题目的描述就一样
现在就差抽题的SQL了
抽题就麻烦了
原来可以一句select   top   10   *   from   题库   where   题型   =   '判断 '   and   知识点= '法律法规 '   and   难易度= '易 '   order   by   newid()

现在就要先抽10个相似度不一样的描述出来
然后每个描述随机抽一道题
也就可以看成这样的一个语句:有若干种产品类型,在每种产品类型中随机抽一个产品,然后把结果放一起
如果用程序,二重循环是可以做到的
但是觉得麻烦
所以来问问,
或者把这个写在存储过程里面怎么写?


[解决办法]
create table test(id int identity(1,1),type varchar(20),question varchar(20))
insert test select 'math ', '123 '
union all select 'math ', '456 '
union all select 'math ', '789 '
union all select 'chinese ', '啊 '
union all select 'chinese ', '我 '
union all select 'chinese ', '你 '
union all select 'english ', 'aaa '
union all select 'english ', 'bbb '
union all select 'english ', 'ccc '
union all select 'english ', 'ddd '

select * from test a where id=
(
select top 1 id from test where type=a.type order by newid()
)

drop table test
[解决办法]
newid()不知道會不會有重復的記錄啊,也沒有具體測試過
[解决办法]
下面这段代码出自邹建的 <sql server2000开发与管理应用实例> ,存储过程的第一个参数表示试卷的份数,第二个参数例: '1:1,3:2 '的意思是:题型为1的1个题目,题型为3的2个题目.
你研究一下吧,相信对你有用


--题库表结构
CREATE TABLE tb(
ID int PRIMARY KEY, --题目ID
Type int, --题型
col1 varchar(10)) --其他需要的字段
INSERT tb SELECT 1,1, '试题1 '
UNION ALL SELECT 2,1, '试题2 '
UNION ALL SELECT 3,3, '试题3 '
UNION ALL SELECT 4,3, '试题4 '
UNION ALL SELECT 5,3, '试题5 '
UNION ALL SELECT 6,3, '试题6 '
GO

--生成试卷的处理过程
CREATE PROC p_test
@试卷份数 int,
@试题数 varchar(100)
AS
SET NOCOUNT ON
--参数检测
IF ISNULL(@试卷份数,0) <1 RETURN
IF ISNULL(@试题数, ' ')= ' ' RETURN

--分拆题型
DECLARE @i int,@Type int
SET @i=LEN(@试题数)
SET ROWCOUNT @i
SELECT ID=IDENTITY(int) INTO # FROM sysobjects a,sysobjects b
SET ROWCOUNT 0
CREATE TABLE #type(Type int,Nums int)
INSERT #type(Type,Nums)
SELECT LEFT(s,CHARINDEX( ': ',s+ ': ')-1),STUFF(s,1,CHARINDEX( ': ',s+ ': '), ' ')
FROM(
SELECT s=SUBSTRING(@试题数,ID,CHARINDEX( ', ',@试题数+ ', ',ID)-ID)
FROM #
WHERE SUBSTRING( ', '+@试题数,ID,1)= ', '
)a WHERE ISNUMERIC(LEFT(s,CHARINDEX( ': ',s+ ': ')-1))=1
AND ISNUMERIC(STUFF(s,1,CHARINDEX( ': ',s+ ': '), ' '))=1
AND STUFF(s,1,CHARINDEX( ': ',s+ ': '), ' ')> 0
AND EXISTS(
SELECT * FROM tb WHERE Type=LEFT(s,CHARINDEX( ': ',s+ ': ')-1))

--使用游标,为每种题型随机抽取题目
CREATE TABLE #t(gID int IDentity,type int,ID int)
DECLARE tb CURSOR LOCAL
FOR
SELECT Type,Nums*@试卷份数 FROM #Type
OPEN tb
FETCH tb INTO @Type,@i
WHILE @@FETCH_STATUS=0
BEGIN
--为每个题型随机抽取题目
SET ROWCOUNT @i
INSERT #t(Type,ID) SELECT @Type,ID FROM tb
WHERE Type=@Type ORDER BY NEWID()
SET @i=@i-@@ROWCOUNT
WHILE @i> 0
BEGIN
SET ROWCOUNT @i
INSERT #t(Type,ID) SELECT @Type,ID FROM tb


WHERE Type=@Type ORDER BY NEWID()
SET @i=@i-@@ROWCOUNT
END
FETCH tb INTO @Type,@i
END
CLOSE tb
DEALLOCATE tb

--显示结果
SET ROWCOUNT 0
SELECT 试卷编号=(b.gid-b1.gid)/c.Nums+1
,a.*
FROM tb a,#t b,#type c
,(SELECT Type,gid=MIN(gid) FROM #t GROUP BY Type)b1
WHERE a.ID=b.ID
AND b.Type=c.Type
AND b.Type=b1.Type
ORDER BY 试卷编号,b.gid
GO

--调用
EXEC p_test 2, '1:1,3:2 '
/*--结果之一
试卷编号 ID Type col1
---------------- ------------------ ----------------- ----------
1 2 1 试题2
1 6 3 试题6
1 3 3 试题3
2 1 1 试题1
2 5 3 试题5
2 4 3 试题4
--*/
[解决办法]
有若干种产品类型,在每种产品类型中随机抽一个产品,然后把结果放一起


select * from test a where id=
(
select top 1 id from test where type=a.type order by newid()
)--就可以了
[解决办法]
http://community.csdn.net/Expert/topic/5552/5552115.xml?temp=.9128839
有点类似,早几天回答的


[解决办法]
类型只有一个?

select top 2 * from test a where id=
(
select top 1 id from test where type=a.type 类型= '类型 ' order by newid()
)

[解决办法]
存储过程同时执行是没问题的


[解决办法]
要好好学习了

[解决办法]
都是超人来着,一句那么长
[解决办法]
呵呵。这句SQL语句真的长啊。 。

热点排行