Update   e   
set   idcard_key   =b.pi_y+a.addressid+c.subid+d.subjectid   +right(10000000+(select   count(*)   from   gw_card   where   address=e.address   and   subjecth=e.subjecth   and   subject=e.subject   and   id <=e.id),5)from     gw_card   e,gw_address   a,gw_pici   b,gw_subjecth   c,gw_subject   d 
where   e.address=a.addressname     and   e.subjecth=c.subjecthead   and   d.subject=e.subject 
其中:gw_card   e(证件表),gw_address(地市州)   a,gw_pici(批次)   b,gw_subjecth(专业)   c,gw_subject(专业下的科目) d 
以上是现在生成证件号码的语句.
但是因为上面红色那段代码同一个类别下的号码却是连续的.在这里思考随机问题的时候可以不考虑前面的类别问题.
现在要求通过修改红色一段代码来实现对同类别下的一段号码随机分配.并且不重复.不空值.速度快.
(数据>7万条)
昨天已经问过一个帖.许多语句或多或少可以实现.但是执行都需要6分钟.(自信解答了这个问题的人去下面地址跟贴JF)
http://topic.csdn.net/u/20071205/13/f6bfe4a5-b3ec-4b91-abf9-5699c0f532cd.html
最简单的模拟问题:
就是说有a,b,c,d,e五个人,给这个5个人随机分1,2,3,4,5这5个编号.每个人分一个,不重复,不空值,有效率.
当然这里的5个人是举例,实际情况是变化的.各个类别下的人何止千百。所以必须要求语句精湛才行.平均每2个小时加1个贴求解此问题.下午3点要交了..急死了...望各位达人BM处理下这个问题.

解决方案 »

  1.   

    上次看过---tryselect top 1000 identity(int,1,1) as id  into #1 from sysobjects a,sysobjects b
    select right('00000'+ltrim(id),5) as id into #2 from #1Update  e       
    set idcard_key =b.pi_y+a.addressid+c.subid+d.subjectid +
    (select top 1 id from #2 aa where not exists(select 1 where aa.id = right(e.idcard_key,5)) order by newid()) 
    from gw_card e,gw_address a,gw_pici b,gw_subjecth c,gw_subject d   
    where e.address=a.addressname and e.subjecth=c.subjecthead and d.subject=e.subject