有一个Access数据库,有4个字段,ID、question、answer、flag(默认为0)用VB连接数据库我想做一个随机查询,但要有一个限制,就是flag字段为1的时候,自动排除该行,不纳入随机查询的范围。我本来想用sql查询语句来写的,可是细细想想,怎么都没有办法实现啊……所以特来向大侠请教了……

解决方案 »

  1.   

    select top 10 * from tablename where flag<>1
      

  2.   

    select * from 表名 where flag<>1这样查询出来的数据就不存在flag=1的了
      

  3.   

    select * from 表名 where flag<>1
    这样虽然能实现排除flag=1的时候,但是那样就不能实现随机查询了……
      

  4.   

    我的意思各位大侠可能没看明白我是想做一个随机的查询,从表中随机抽出一组数据来,但是随机查询的过程中要排除flag字段=1的那行数据!~
      

  5.   

    语句没错啊,怎么实现随机与这个哪有关系?根据什么来随的机呢?ID吧某ID的flag=1就skip呗,或者根本就没明白你的意思??
      

  6.   

    比如我现在有一个这样的表ID   QUESTION    ANSWER   FLAG
    1    问题1        答案1    0
    2    问题2        答案2    0
    3    问题3        答案3    1
    4    问题4        答案4    0
    5    问题5        答案5    0
    在这个表里面随机抽出一组数据,但是抽出的数据FLAG不能为1。
    这样的功能要怎么实现哦?请教大侠!~
      

  7.   

    这样可否?"select * from 表 where ID=" & Int((ID_max * Rnd) + 1) & "'" and flag<>1"如果记录为0.do it again...
      

  8.   

    我不是程序员,谈谈我的想法
    首先查询出所有flag不等于1的记录,再用随机函数算一个小于记录总数的数字,再移到这个记录上即可。
    我不记得语法了,不好意思。
      

  9.   

    先得一个随机数,在id范围内.然后看这个ID的记录的flag是否=1,是的话,重新取一次...你说的反一下就可以了,这样最简单.
      

  10.   

    以上的执行效率怎么样?小心问一句,如果运气很不好,老是抽到FLAG=1的怎么办?以上的办法我早就想到了,来论坛里询问,就是想要一个更好的解决方案~~
      

  11.   

    也得遵循你的第一要求就是flag<>1
    因此就很简单的理解了,先查询出符合以上要求的记录后,再作随机查询..
      

  12.   

    图简洁就那样..可运气不好也是问题.
    那只把先把flag=0的id拿出来.幅值给一个动态数组了.
    然后根据这个数组在大小确定随机数产生的范围.
    得到随机数,回头拿这个id的记录.
      

  13.   

    或着在初始化时
    select ID from 表名 where flag<>1
    把ID存到存到一个数组X()
    然后随机产生数组的下标i,再
    "select * from 表 where ID=" + X(i)
      

  14.   

    那如果我想抽取出来以后,就把那个记录的flag标记改为1,然后下一轮的抽取的时候就把它去掉,不纳入随机抽取的范围内这样的话,用动态数组能实现吗?(就是说每抽一个,下一次抽取的范围里面就少一个……)
    再次感谢各位大侠,等结帖的时候,我一定会给你们分的,虽然很少,但是是我的一点心意……
      

  15.   

    数据设计时做两个字段:flag1(等同于你上面的flag) flag2    dim a  integer    dim sqlstr as string    dim rs as new recordset
       
        a=Int((ID_max * Rnd) + 1)
      
        sqlstr = "    sqlstr = "select * from 表"    set rs = cw_dataenvi.conn.execute(sqlstr)      with rs        if not rs.eof then
              
              if rs.fields("flag2")<>1 then                       '判断更新的那个标志是否为1
        
           sqlstr = "select * from 表 where ID=" & a & "'" and flag1<>1"       set rs = cw_dataenvi.conn.execute(sqlstr)
       
               with rs
             
               if not rs.eof then               if rs.fields("flag1")<>1 then
                  
                      update ....... '更新表中的flag1 , flag 2!               end if           end if           end with
         
           end if       end if       end with
      

  16.   

    我支持这个 "select * from 表 where ID=" & Int((ID_max * Rnd) + 1) & "'" and flag<>1"
      

  17.   

    "select * from 表 where ID=" & Int((ID_max * Rnd) + 1) & "'" and flag<>1"
    这个我觉得有些矛盾吧,如果随机选择的ID恰好那行记录是flag=1,那怎么办?那样出来的是空的记录哦……什么都没有的