Sql根据计数动态更新登录ID

时间:2012-09-06 14:38:20

标签: sql sql-server

我有2张桌子。一个是主表,另一个是登录表。我可能在主表中有10个记录,在登录表中有6个记录。每个登录ID必须同等地分配给主表。任何人都可以给我更新登录信息的最佳解决方案。

实施例

Create table ##t1 
(id int identity,
name varchar(5),
loginid varchar(10)
divno char(3))




create table ##l1
(
id int identity,
name varchar(10),divno char(3))

insert into ##t1 values
('Jin',null,'001')
insert into ##t1 values
('Anu',null,'001')
insert into ##t1 values
('kir',null'002')
insert into ##t1 values
('Asi',null,'003')
insert into ##t1 values
('Nil',null,'002')
insert into ##t1 values
('sup',null,'003')
insert into ##t1 values
('amu',null,'003')
insert into ##t1 values
('mani',null,'003')

insert into ##l1 values
('A','001')
insert into ##l1 values
('B','001')
insert into ##l1 values
('C','002')
insert into ##l1 values
('D','002')
insert into ##l1 values
('E','002')
insert into ##l1 values
('F','003')

数据示例

Main table

id          name  loginid divno
----------- ----- ----------
1           Jin   NULL    001
2           Anu   NULL    001
3           kir   NULL    002
4           Asi   NULL    003
5           Nil   NULL    002
6           sup   NULL    003
7           amu   NULL    003
8           mani  NULL    003

Login Table

id          name    divno
----------- -------------
1           A        001
2           B        001
3           C        002
4           D        002
5           E        002
6           F        003

期望的输出

enter image description here

我们如何在没有循环的情况下做到这一点?

2 个答案:

答案 0 :(得分:2)

 update ##t1 
 set loginid = #l1.name
 from   
      ##t1
           inner join 
      (select *, (ROW_NUMBER() Over (order by id) -1)% (select COUNT(*) from ##l1)+1 as rn from ##t1) v
           on ##t1.id = v.id
           inner join 
      ##l1 
           on v.rn = ##l1.id

答案 1 :(得分:0)

让我将其作为选择查询而不是upadte。

select id, name, l.login
from (select mt.*,
             (row_number() over (order by id) % l.loginCount) + 1 as loginSeqnum
      from MainTable mt cross join
           (select count(*) as loginCount from login) l
     ) mt join
     (select l.*, row_number() over (order by id) as seqnum
      from login l
     ) l
     on mt.LoginSeqnum = l.seqnum  

这样做是为登录添加一个序列号(以防loginid不是1..n。然后它为第一个表中的每个记录计算一个类似的值。

这个方法的一个好处是你可以修改它以获得更多的随机排序,通过改变"顺序" row_number()语句中的子句。例如,使用" newid()"将随机化分配,而不是以循环方式进行。