最近在做一个考试系统,是.net+oracle,被一个条件查询难住了,在这里跪求大虾的帮忙。查询条件如下:
题库表中的题目属性:工种,级别,难易度,题型。在设置条件的时候是这样的:首先是根据题型(单选、多选、判断、计算)来确定每个题型的题目数量和分值,这样题目总量也确定了。然后设置工种、级别和难易度占总体的比例,也就是说其他三个条件中确定的题目总数都是等于题型确定的那个总数的。题型、工种、级别和难易度之间在设置题量的时候没有任何联系,要根据这多个条件中要求的题目数量从数据库中查询。我会在线等,希望高手帮忙啊,解决问题一定全分送上!!!

解决方案 »

  1.   

    我重新描述一下
    】条件如下
    题型:  
        单选题:共()题 ()分/个   多选题:共()题 ()分/个   判断题:共()题 ()分/个   计算题:共()题 ()分/个     
     
       级别:  
        初级:共()题    中级:共()题    高级:共()题    技师:共()题    高级技师:共()题  
     
       类型:  
        专业:共()题    安全规章制度:共()题    员工守则:共()题    各工种岗位职责:共()题    操作规程:共计算附加题:共()题  
     
       重要程度:  
        X:共()题    Y:共()题    Z:共()题      
    注:题型、级别、类型、重要程度中总题目之和必须相等。  
     以上4个条件都是题目的属性,他们作为条件之间没有任何关系,只是个条件设置的数目之和相等。
    题库表中题目的属性包含以上条件(题型、级别、类型、重要程度),现在需要根据条件到数据库查询出这些设置的题目数量。
      

  2.   

    随即生成试卷
    只不过当时用的是ASP+SQLSERVER
      

  3.   

    你这个需求还是不够具体
    具体情况具体分析,这东西不难随即的实现利用oracle随机数就行
    sys.dbms_random.value(min,max)
      

  4.   

    随机不难实现.
    是不是拆成了很多sql来查询?
      

  5.   


    当时我做的需求是这样的(记得是)
    1、各项题目分别10道,总分也是固定的
    2、DB中题目有难易程度
        每项题目1至6题--简单
        每项题目7至8题--中等
        每项题目9至10题--困难SQLSERVER随机数就是rand()
    只要注意别取重复的题目就行了,没什么
      

  6.   


    用一个SQL实现难度大不说,也未必就是好事,对吧 哥顺便问个问题 我今天看帖子怎么有时只显示前几楼,后面就看不到
    有这情况不?
      

  7.   

    看大家讨论的这么激情,小弟突发奇想,不知道是否可以按照这样去实现:
    我想题库表中肯定都有个唯一的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)+...=总题数
    不知道说清楚了没有,大侠们见笑
      

  8.   

    非常感谢你的回答,我看了半天 但是那个sum(tx_d(题型为单项))要如何去查询呢,能 具体说说嘛,这个函数如何得到想要的题数呢?
      

  9.   

    没环境 ,大体说下我的思路吧,你看下还有什么不明白的,假设题库表名为tk,有5个字段,ID,TX(取值范围1-4),JB(取值范围1-5),LB(取值范围1-5),ZYCD(取值范围1-3)
    比如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的思想就对了有时间我会测试下
      

  10.   

    你的回复我仔细看了 也查询出ZB的结果来了,可是加不上条件啊 你在上面说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)+...=总题数
     后面的条件加不上啊,需要使用group by 但是用了group by之后就得不到想要的数据了。再次希望高手能不吝赐教啊,距离成功只有一小步了 再次感谢您的回复。希望您能继续给解释解释如何加上sum()值的限制拜谢!!
      

  11.   

    也许你说的sum()=数量 是一种思想 但具体的实现方法要怎么实现呢。  查询出虚拟表来了 如何限制条件和数量来得到想要的结果呢