最近在做一个考试系统,是.net+oracle,被一个条件查询难住了,在这里跪求大虾的帮忙。查询条件如下:
题库表中的题目属性:工种,级别,难易度,题型。在设置条件的时候是这样的:首先是根据题型(单选、多选、判断、计算)来确定每个题型的题目数量和分值,这样题目总量也确定了。然后设置工种、级别和难易度占总体的比例,也就是说其他三个条件中确定的题目总数都是等于题型确定的那个总数的。题型、工种、级别和难易度之间在设置题量的时候没有任何联系,要根据这多个条件中要求的题目数量从数据库中查询。我会在线等,希望高手帮忙啊,解决问题一定全分送上!!!
题库表中的题目属性:工种,级别,难易度,题型。在设置条件的时候是这样的:首先是根据题型(单选、多选、判断、计算)来确定每个题型的题目数量和分值,这样题目总量也确定了。然后设置工种、级别和难易度占总体的比例,也就是说其他三个条件中确定的题目总数都是等于题型确定的那个总数的。题型、工种、级别和难易度之间在设置题量的时候没有任何联系,要根据这多个条件中要求的题目数量从数据库中查询。我会在线等,希望高手帮忙啊,解决问题一定全分送上!!!
】条件如下
题型:
单选题:共()题 ()分/个 多选题:共()题 ()分/个 判断题:共()题 ()分/个 计算题:共()题 ()分/个
级别:
初级:共()题 中级:共()题 高级:共()题 技师:共()题 高级技师:共()题
类型:
专业:共()题 安全规章制度:共()题 员工守则:共()题 各工种岗位职责:共()题 操作规程:共计算附加题:共()题
重要程度:
X:共()题 Y:共()题 Z:共()题
注:题型、级别、类型、重要程度中总题目之和必须相等。
以上4个条件都是题目的属性,他们作为条件之间没有任何关系,只是个条件设置的数目之和相等。
题库表中题目的属性包含以上条件(题型、级别、类型、重要程度),现在需要根据条件到数据库查询出这些设置的题目数量。
只不过当时用的是ASP+SQLSERVER
具体情况具体分析,这东西不难随即的实现利用oracle随机数就行
sys.dbms_random.value(min,max)
是不是拆成了很多sql来查询?
当时我做的需求是这样的(记得是)
1、各项题目分别10道,总分也是固定的
2、DB中题目有难易程度
每项题目1至6题--简单
每项题目7至8题--中等
每项题目9至10题--困难SQLSERVER随机数就是rand()
只要注意别取重复的题目就行了,没什么
用一个SQL实现难度大不说,也未必就是好事,对吧 哥顺便问个问题 我今天看帖子怎么有时只显示前几楼,后面就看不到
有这情况不?
我想题库表中肯定都有个唯一的ID吧,每条记录有四个属性(题型、级别、类型、重要程度),我们对每个属性进行扩展,比如题型有4种,我们分为单项,多项,判断,计算,即如果一个题的题型为多项选择题,则其扩展后的属性为(0,0,0,1,级别,类型,重要程度),即在如果一个题的题型为多项选择,将这个位置置为1,其余的单项。判断、计算属性位置上置为0;级别、类型、重要程度也做同样的扩展,
扩展完后一个题目的记录可能为(ID,0,0,1,0(前4个有数的位置代表题型),0,0,1,0,0(代表级别),0,0,1,0,0(代表类型),0,1,0(代表重要程度)) 这个就代表题型为判断级别为高级类型为员工守则重要程度为Y的一道题,这个属性扩展可以利用case when 实现,假设扩展后的结果集为ZB,
再利用下面的语句查处符合的题目ID来select id from zb having sum(tx_d(题型为单项))=Param1 AND sum(tx_d(题型为多项))=param2 ...
and sum(tx_d)+sum(tx_d)+..=sum(jb_1)+sum(jb_2)+...
and sum(jb_1)+sum(jb_2)+...=sum(lx_1)+sum(lx_2)+...
and sum(lx_1)+sum(lx_2)+...=sum(zycd_1)+sum(zycd_2)+...
and sum(zycd_1)+sum(zycd_2)+...=总题数
不知道说清楚了没有,大侠们见笑
比如TX=1代表单选题 TX=2 多选题 TX=3判断题 TX=4计算TI
JB=1代表初级 JB=2中级 以此类推
(select ID,
to_number(substr(zb."题型",1,1)) tx_d,--单选选择,只有0 和1
to_number(substr(zb."题型",2,1)) tx_duoxuan,--多选
to_number(substr(zb."题型",3,1)) tx_pd,--判断
to_number(substr(zb."题型",4,1)) tx_js,--计算
to_number(substr(zb."级别",1,1)) jb_cj,--初级
to_number(substr(zb."级别",2,1)) jb_zj,--中级
to_number(substr(zb."级别",3,1)) jb_gj,--高级
to_number(substr(zb."级别",4,1)) jb_jishi,--技师
to_number(substr(zb."级别",5,1)) jb_gjjs,--高级技师
.
.
.from
(select
ID,
(case when t.tx=1 then '1000'
when t.tx=2 then '0100'
when t.tx=3 then '0010'
when t.tx=4 then '0001' end) as "题型" ,
(case when t.jb=1 then '10000'
when t.jb=2 then '01000'
when t.jb=3 then '00100'
when t.jb=4 then '00010'
when t.jb=5 then '00001' end) as "级别"
.
.
.
from tk t) zb
)
这个结果集就是我在17L 说的“扩展后的结果集为ZB”
通过上面就可以把原始的tb的一条记录扩展成ID,"单选",“多选”,“判断”,“计算”,“初级”这样,
从而sum(tx_d(题型为单选)) 就能轻而易举获得了。我觉得应该能实现楼主所想要的,关键处就是理解0 1的思想就对了有时间我会测试下
and sum(tx_d)+sum(tx_d)+..=sum(jb_1)+sum(jb_2)+...
and sum(jb_1)+sum(jb_2)+...=sum(lx_1)+sum(lx_2)+...
and sum(lx_1)+sum(lx_2)+...=sum(zycd_1)+sum(zycd_2)+...
and sum(zycd_1)+sum(zycd_2)+...=总题数
后面的条件加不上啊,需要使用group by 但是用了group by之后就得不到想要的数据了。再次希望高手能不吝赐教啊,距离成功只有一小步了 再次感谢您的回复。希望您能继续给解释解释如何加上sum()值的限制拜谢!!