1

私は2つのテーブルを持っています。1つはメインテーブルで、もう1つはログインテーブルです。メインテーブルに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

これを、upadteとしてではなく、selectクエリとして実行させてください。

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でない場合に備えて。次に、最初のテーブルの各レコードに対して同様の値を計算します。

このメソッドの優れた点の1つは、row_number()ステートメントの「orderby」句を変更することで、よりランダムな順序を取得するように変更できることです。たとえば、「order by newid()」を使用すると、ラウンドロビン方式ではなく、割り当てがランダム化されます。

于 2012-09-06T14:50:54.887 に答える