subject
-----------------------
01     施工员
02     预算员
03     资料员
……
-----------------------
enter
-----------------------name   subject    examnumber
王1     施工员    0100001
王2     预算员    0200001
王3     预算员    0200002
王4     施工员    0100002
王5     施工员    0100003
王6     资料员    0300001
王7     资料员    ……
王8     预算员    ……
------------------------
现在表里面的examnumber 全是空的。
求一条更新语句来实现这个号码的更新
关键是号码后面的5位排序号。应该怎么处理。
这里不考虑数据的删除添加或者更新变动。

解决方案 »

  1.   

    update e
    set
        examnumber = s.id+right('00000'+rtrim(select count(*) from enter where subject=e.subject and name<=e.name),5)
    from 
        enter e,subject s
    where
        e.subject= s.subject
      

  2.   

    服务器: 消息 156,级别 15,状态 1,行 3
    在关键字 'select' 附近有语法错误。
    服务器: 消息 170,级别 15,状态 1,行 3
    第 3 行: ')' 附近有语法错误。什么意思?
      

  3.   

    update e
    set
        examnumber = s.id+right(100000+(select count(*) from enter where subject=e.subject and name<=e.name),5)
    from 
        enter e,subject s
    where
        e.subject= s.subject
      

  4.   

    还有那个name<=e.name 是什么意思。这里取出来似乎不是值。怎么能比较呢?
      

  5.   

    name<=e.name 是什么意思
    --------------------------------
    子查询中的name与主查询的name进行比较。
      

  6.   

    LZ:
    subject=e.subject And name<=e.name 的意思就是
    subject相同在enter表中从最小的name开始统计subject出现的个数
    如果你表enter有ID的话可以更好的理解...
    ---------------------------------------
    王1     施工员    1  --施工员第一次出现 
    王2     预算员    1  
    王3     预算员    2
    王4     施工员    2  --施工员第二次出现
    王5     施工员    3  --施工员第三次出现
    王6     资料员    1
    王7     资料员    2
    王8     预算员    3
    ------------------
    Declare @subject Table(id varchar(4),subject varchar(10))
      Insert @subject Select '01',     '施工员'
      Union All Select '02',     '预算员'
      Union All Select '03',     '资料员'Declare @enter Table(name varchar(10),subject varchar(10),examnumber varchar(10))
      Insert @enter Select '王1',     '施工员',''
          Union All Select '王2',     '预算员',''
          Union All Select '王3',     '预算员',''
          Union All Select '王4',     '施工员',''
          Union All Select '王5',     '施工员',''
          Union All Select '王6',     '资料员',''
          Union All Select '王7',     '资料员',''
          Union All Select '王8',     '预算员',''
    Select * From @subject
    Select * From @enterUpdate E
    Set
        examnumber = S.id+Right('100000'+(Select Count(*) From @enter Where subject=e.subject And name<=e.name),5)
    From 
        @enter E 
    Inner Join 
        @subject S
    On  E.subject= S.subjectSelect * From @enter
    /*
    name       subject    examnumber 
    ---------- ---------- ---------- 
    王1         施工员        0100001
    王2         预算员        0200001
    王3         预算员        0200002
    王4         施工员        0100002
    王5         施工员        0100003
    王6         资料员        0300001
    王7         资料员        0300002
    王8         预算员        0200003(所影响的行数为 8 行)
    */
      

  7.   

    这里是查处来的name 是一个名字。
    就算是主查询与子查询。
    但是名字和名字怎么比较?
    为什么要比较?
      

  8.   

    如果你表enter有ID的话可以更好的理解
    试试用临时表连接更新
    Select ID=Identity(int,1,1),* Into # From enter再将subject与#连接更新
    将name<=e.name 改成id<=#.id 试试看
      

  9.   

    Select ID=Identity(int,1,1),* Into # From @enter
    -----------------------------------------------
    Update E
    Set
        examnumber = S.id+Right('100000'+(Select Count(*) From #
    Where subject=E.subject And id<=E.id),5)
    From 
        # E 
    Inner Join 
        @subject S
    On  E.subject= S.subject----再查看临时表
    Select * From #
      

  10.   

    如题目上面再增加一个表
    address
    -----------------------
    01   四川省
    02   北京市
    03   天津市
    ……
    -----------------------
    subject
    -----------------------
    01     施工员
    02     预算员
    03     资料员
    ……
    -----------------------
    enter
    -----------------------
    name   subject address   examnumber
    王1     施工员  天津市   030100001
    王2     预算员  北京市   020200001
    王3     预算员  北京市   020200002
    王4     施工员  四川省   020100001
    王5     施工员  四川省   020100002
    王6     资料员  天津市   030300001
    王7     资料员  天津市   030300002
    王8     预算员  天津市   030200001
    王9     预算员  天津市   030200002
    ------------------------
    现在表里面的examnumber 全是空的。
    求一条更新语句来实现这个号码的更新
    上面是比较简单的。
    这里是  地址+科目+5位排序号
    这里加入地址以后应该在上面的语句里面怎么修改才可以实现啊。
      

  11.   

    wenwenti14() ( ) 信誉:100  2007-08-03 14:20:57  得分: 0  
     
     
       如题目上面再增加一个表现在表里面的examnumber 全是空的。
    求一条更新语句来实现这个号码的更新
    上面是比较简单的。
    这里是  地址+科目+5位排序号
    这里加入地址以后应该在上面的语句里面怎么修改才可以实现啊。
    ------------------------------------稍作修改update e
    set
        examnumber = a.id + s.id+right(100000+(select count(*) from enter where subject=e.subject and name<=e.name),5)
    from 
        enter e,subject s, address a
    where
        e.subject= s.subject and a.address = e.address
      

  12.   

    再关联一次就可以了
    这样也行
    ------
    Update E
    Set
        examnumber = S.id+Right('100000'+(Select Count(*) From @enter Where subject=e.subject And name<=e.name),5)
    From 
        enter E 
    Inner Join 
        subject S 
    On  E.subject= S.subject
    Inner Join
        address A
    On  E.address=A.address