0

这是对此问题的后续问题:

多对多关系中的查询示例

关于更新联结表。为此,我必须在 WHERE 子句中使用联结表中的两个键值。

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

例如,在此示例中,假设我想更新 UserAddresses 表中的 AddressId 字段,因为用户更改了他的地址。我必须在更新 WHERE 子句中同时使用现有的 UserId 和地址 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 子句似乎出错了。

有什么想法吗?

4

3 回答 3

1

这实际上看起来像一个多对一的关系。如果不是,您将需要旧地址 ID 以及新地址 ID 和用户 ID 来进行更改。如果它是多对一关系,那么一个简单的更新应该可以工作,因为每个用户 ID 只存在一个用户 ID/地址 ID 对:

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

如果它确实是多对多关系,则您需要从许多可能的关系中找到现有的一对并更新那个——除了用户 ID 之外,您还需要新旧地址 ID。

update UserAddresses
set AddressId = @NewAddressId
where UserId = @UserId and @AddressId = @OldAddressId
于 2009-02-22T15:03:29.760 回答
0

为什么要使用临时表?

CREATE PROCEDURE dbo.test
(
@UserId int,
@AddressId int
)
AS
update UserAddresses
set AddressId = @AddressIdD
WHERE UserId = @UserId
于 2009-02-22T15:04:06.467 回答
0

我认为 tvanfossom 正确地指出了代码中的问题。

使用上面的表格,您的操作可以通过多种方式完成:

  • 插入指向新地址的链接并删除指向旧地址的链接,保留或删除链接到的地址记录。
  • 按照 tvanfossom 描述的方式更新链接记录(LuckyLindys 查询会将用户的所有注册地址设置为相同的地址)。
  • 更新链接到的地址记录。

你使用哪一个取决于你在你的应用程序中想要什么。我可能只是更新链接地址,还是您需要保留旧地址?

于 2009-02-22T15:12:37.803 回答