subject
-----------------------
01 施工员
02 预算员
03 资料员
……
-----------------------
enter
-----------------------name subject examnumber
王1 施工员 0100001
王2 预算员 0200001
王3 预算员 0200002
王4 施工员 0100002
王5 施工员 0100003
王6 资料员 0300001
王7 资料员 ……
王8 预算员 ……
------------------------
现在表里面的examnumber 全是空的。
求一条更新语句来实现这个号码的更新
关键是号码后面的5位排序号。应该怎么处理。
这里不考虑数据的删除添加或者更新变动。
-----------------------
01 施工员
02 预算员
03 资料员
……
-----------------------
enter
-----------------------name subject examnumber
王1 施工员 0100001
王2 预算员 0200001
王3 预算员 0200002
王4 施工员 0100002
王5 施工员 0100003
王6 资料员 0300001
王7 资料员 ……
王8 预算员 ……
------------------------
现在表里面的examnumber 全是空的。
求一条更新语句来实现这个号码的更新
关键是号码后面的5位排序号。应该怎么处理。
这里不考虑数据的删除添加或者更新变动。
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
在关键字 'select' 附近有语法错误。
服务器: 消息 170,级别 15,状态 1,行 3
第 3 行: ')' 附近有语法错误。什么意思?
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
--------------------------------
子查询中的name与主查询的name进行比较。
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 行)
*/
就算是主查询与子查询。
但是名字和名字怎么比较?
为什么要比较?
试试用临时表连接更新
Select ID=Identity(int,1,1),* Into # From enter再将subject与#连接更新
将name<=e.name 改成id<=#.id 试试看
-----------------------------------------------
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 #
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位排序号
这里加入地址以后应该在上面的语句里面怎么修改才可以实现啊。
如题目上面再增加一个表现在表里面的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
这样也行
------
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