日期:2014-05-18  浏览次数:20627 次

不一般的随机抽取试题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