2009-02-22 52 views
0

這是一個後續的問題這一個:關於更新結表在更新結表許多一對多的關係

Query examples in a many-to-many relationship

。爲此,我必須在WHERE子句中的聯結表中使用這兩個鍵值。

Users  UserAddresses  Addresses 
=======  =============  ========= 
FirstName UserId   City 
LastName AddressId   State 
           Zip 

例如,在這個例子中,我想更新UserAddresses表中的AddressId字段,因爲用戶更改了他的地址。我將不得不使用現有的UserId和更新WHERE子句中的地址AddressId。

我正在使用存儲過程,並傳遞UserId和新的AddressId作爲參數。

我已經嘗試這樣的:

CREATE PROCEDURE dbo.test 
(
@UserId int, 
@AddressId int 
) 
AS 
create table #temp 
    (
    UserId int not null, 
    AddressId int not null 
    ) 
    insert into #temp select UserId, AddressId from UserAddresses where UserId = @UserId 

update UserAddresses 
set AddressId = @AddressIdD 
WHERE (UserId+AddressId in #temp table = UserId+AddressId passed in as parameters)?? 

我已經試過各種組合,但我似乎無法得到正確的語法。

UserId傳入,當然會與UserAddresses表中的相同,但這只是我嘗試一些事情。 WHERE子句是它似乎出錯的地方。

有什麼想法?

回答

1

這實際上看起來像是多對一的關係。如果不是,您需要使用舊的地址標識以及新的地址標識和用戶標識來進行更改。如果它是一個多對一的關係那麼簡單的更新應該因爲只有一個用戶ID /地址ID對工作將存在爲每個用戶ID:

update UserAddresses 
set AddressId = @AddressId 
where UserId = @UserId 

如果它確實是,你需要一個多一對多的關係從許多可能的對中找出現有對並更新那一對 - 這就是除了用戶標識之外還需要新舊地址標識的地方。

update UserAddresses 
set AddressId = @NewAddressId 
where UserId = @UserId and @AddressId = @OldAddressId 
+0

這是一個M-T-M rel。,這就是爲什麼我想選擇現有的UserId和AddressId到臨時表中,然後在實際更新中引用該表。我認爲這應該是可能的,但我無法正確地理解語法。 – Soeren 2009-02-22 16:09:55

0

爲什麼使用臨時表?

CREATE PROCEDURE dbo.test 
(
@UserId int, 
@AddressId int 
) 
AS 
update UserAddresses 
set AddressId = @AddressIdD 
WHERE UserId = @UserId 
0

tvanfossom正確地指出了你的代碼中的問題,我想。

通過上面的表格,您的操作可能會以不同的方式來完成:

  • 插入鏈接到新的地址,並刪除鏈接到舊地址,無論是保存或刪除就是BEING鏈接的地址記錄至。
  • 更新鏈接記錄爲tvanfossom描述(LuckyLindys查詢將設置用戶的所有註冊地址爲同一個)。
  • 更新正在鏈接的地址記錄。

你使用哪一個取決於你的應用需求。我可能只是更新鏈接地址,還是需要保留舊地址?