1

私はSQLデータベースに取り組んでいます

私はテーブルユーザーを持っています

 Id   Name   Age    AddressId
----+------+------+-----------

ここで、AddressIdはテーブル名Addressesへの外部キーです。

アドレステーブル:

 Id   Country   State  City   ZipCode
----+---------+------+------+---------

すべてのユーザーをループするSQLスクリプトが必要です。そのユーザーのAddressIdがnullの場合は、デフォルト値を使用してAddressesテーブルに新しいレコードを作成し、外部キーとしてユーザーに割り当てます。

SQLスクリプトでは次のようになります。

Foreach (User in Users)
    If(user.AddressId==null)
        INSERT INTO Addresses values('DefaultCountry', 'DefaultState', 'DefaultCity', 99999)
        User.AddressId= the id of the newly created row

編集 それは1対1の関係です

助けてくれてありがとう

4

2 に答える 2

1

を使用mergeoutputて、ループなしでこれを行うことができます。

declare @IDs table(UserId int, AddressId int);

merge Addresses as T
using (select Id, 'DefaultCountry', 'DefaultState', 'DefaultCity', 99999
       from Users
       where AddressID is null) as S (UserId, Country, State, City, ZipCode)
on 0 = 1
when not matched then
  insert(Country, State, City, ZipCode) 
    values (S.Country, S.State, S.City, S.ZipCode)
output S.UserId, inserted.Id into @IDs;

update Users
set AddressId = IDs.AddressID
from @IDs as IDs
where Users.Id = IDs.UserId;

SE-データ

1つのアドレスを追加するだけで、そのアドレスを持っていないすべてのユーザーに接続する必要がある場合は、代わりにこれを使用します。

declare @AddressId int;

insert into Addresses(Country, State, City, ZipCode)
  values('DefaultCountry', 'DefaultState', 'DefaultCity', 99999);

set @AddressId = scope_identity();

update Users
set AddressId = @AddressId
where AddressId is null;
于 2012-05-25T07:58:55.840 に答える
0
create table #Users
(
    id int,
    AddressID int
)

insert into #Users(id, AddressID)values(1, 1)
insert into #Users(id, AddressID)values(2, null)

create table #Address
(
    id int Identity(1,1),
    nam varchar(100)
)

declare @id int
declare @AddressID int
declare @NewAddressID int

declare cur cursor for Select id, AddressID from #Users Where AddressID is null
open cur
Fetch next from cur into @id, @AddressID
While(@@Fetch_Status = 0)
Begin
    Fetch next from cur into @id, @AddressID
    insert into #Address(nam)values(NEWID())
    Set @NewAddressID = SCOPE_IDENTITY();
    Update #Users
    Set AddressID = @NewAddressID
    Where id = @id
End

Deallocate cur

SELECT * FROM #Address
SELECT * FROM #Users
drop table #Address
drop table #Users
于 2012-05-25T09:46:56.193 に答える