1

我有 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

期望的输出

在此处输入图像描述

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

4

2 回答 2

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
于 2012-09-06T14:46:45.203 回答
0

让我将其作为选择查询而不是作为更新来执行。

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() 语句中的“order by”子句来修改它以获得更多随机排序。例如,使用“order by newid()”将使分配随机化,而不是以循环方式进行。

于 2012-09-06T14:50:54.887 回答