奖项      名额
特等奖       3
一等奖      10
二等奖      25
三等奖      40
四等奖      80
共1000人左右参加抽奖 使用的是工号如何进行不重复随机抽奖呢???
谢谢!我想表的设计结构应是:ID,工号, 姓名,部门, 是否已中奖

解决方案 »

  1.   

    select * from T
    where 是否已中奖='NO'
    order by newid()
      

  2.   

    ID, 工号, 姓名, 部门, 中奖奖项(為NULL時未中獎)
      

  3.   

    参照邹老师的例子生成不重复的数字
    生成100万条8位不重复数据的示例USE tempdbGO -- 创建测试表CREATE TABLE tb(id char(8)) -- 创建用于自动过滤重复值的唯一索引CREATE UNIQUE INDEX IX_tb ON tb(id)WITH IGNORE_DUP_KEY GO -- 测试数据插入的处理时间, 记录开始处理的时间点DECLARE @dt datetimeSET @dt = GETDATE() -- 插入随机数据SET NOCOUNT ONDECLARE @row intSET @row = 1000000  -- 设置总记录数WHILE @row >0BEGIN    -- 显示提示信息, 表示还需要插入多行数据    RAISERROR('need %d rows', 10, 1, @row) WITH NOWAIT     -- 插入随机的位编码数据    SET ROWCOUNT @row    INSERT tb SELECT        id = RIGHT(100000000 + CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 8)    FROM syscolumns c1, syscolumns c2    SET @row = @row - @@ROWCOUNTEND -- 显示插入数据使用的时间SELECT BeginDate = @dt, EndDate = GETDATE(),     Second = DATEDIFF(Second, @dt, GETDATE()),GO -- 显示最终的结果记录是否正确SELECT COUNT(*) FROM tbGO -- 删除测试DROP TABLE tb 解决中用到的技巧:1.    控制产生的数据不重复,直接使用唯一索引中的 IGNORE_DUP_KEY 选项,使插入数据中的重复值自动过滤,避免手工处理重复2.    使用 CHECKSUM 配合 NEWID() 函数,使生成的数据尽量随机,一般生成随机数会考虑使用 RAND() 函数,但这个函数是产生伪随机值,用下面的语句测试一下,会发现产生的数据全部是一样的,这不适用于想批量生成多个随机数,而NEWID() 函数生成的是GUID,基本上不会有重复的,再通过CHECKSUM将其转化成数字,这样产生重复的可能性会比较小SELECT TOP 10    RAND()FROM sysobjects3.    在效率控制,使用循环+批量生成的方式,而不是传统的逐个生成。在SQL Server中,每个插入语句都会有一个内部的事务处理,如果逐条插入,则事务的开销太大,效率势必非常低;不考虑一次性生成100万数据,一则因为生成的数据可能有重复的,去掉重复就没有100万了,二则一次性生成100万数据,消耗的内存和CPU资源也很高,一般的电脑可能承受不住
      

  4.   

    设计两个表
    表一:
    ID, 工号, 姓名, 部门, 中奖编号
    表二:
    ID,  中奖编号,奖项在页面程序里设计 random:)
      

  5.   

    ----基础表设计:
    人事档案表:人事ID,工号, 姓名,部门....
        奖品表:奖品编号,奖品名称
        获奖表:人事ID,奖品编号----抽奖过程
    才1000人,使用循环的方法实现,
    FOR(int i=0;i<1000;i++)
    {
       WHILE (是否抽奖成功=false)
        {
           IF(是否抽奖成功=true) break;
           --随机生成一个获奖编号
            IF(判断获奖编号是否存在,当存在时)
                 IF(是否该奖品是否已经给抽完)=抽完
                    --重新随机生成一个获奖编号,返回上一步骤
                 else
                    --把获奖信息写入数据库
            ELSE
             {
                --把不获奖信息写入数据库,直接转到下一个人抽奖
             }
        }
    }
    呵呵,不知道是否ok哦!!?
      

  6.   

    if 工号=自己工号
    begin
    自己中奖
    end
    else
    begin
    if 自己已中奖
    begin
    下一个中奖号码
    end
    下一个
    end
      

  7.   


    select top 3 NEWID() as tmp_id,* from Tb_所有 
    where id not in Tb_中将
    order by tmp_id
      

  8.   

    NEWID() + order by tmp_id 就是随机了 top  中奖 个数where id not in (selet id from Tb_中奖) //避免二等奖有一等奖的