在更新结表许多一对多的关系


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到临时表中,然后在实际更新中引用该表。我认为这应该是可能的,但我无法正确地理解语法。 22 2月. 092009-02-22 16:09:55

  0

是的,但您只是通过用户ID选择到临时表中。如果用户可以拥有多个地址,那么您需要找到与正在删除的旧地址相匹配的对,并将其替换。 22 2月. 092009-02-22 17:22:27


0

为什么使用临时表?

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

0

tvanfossom正确地指出了你的代码中的问题,我想。

通过上面的表格,您的操作可能会以不同的方式来完成:

  • 插入链接到新的地址,并删除链接到旧地址,无论是保存或删除就是BEING链接的地址记录至。
  • 更新链接记录为tvanfossom描述(LuckyLindys查询将设置用户的所有注册地址为同一个)。
  • 更新正在链接的地址记录。

你使用哪一个取决于你的应用需求。我可能只是更新链接地址,还是需要保留旧地址?