这是对此问题的跟进问题:
Query examples in a many-to-many relationship
关于更新联结表。为此,我必须在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子句似乎出错了。
有什么想法吗?
答案 0 :(得分:1)
这实际上看起来像是多对一的关系。如果不是,您将需要旧的地址ID以及新的地址ID和用户ID来进行更改。如果它是多对一关系,那么简单的更新应该有效,因为每个用户ID只存在一个用户id /地址id对:
update UserAddresses
set AddressId = @AddressId
where UserId = @UserId
如果真的是多对多关系,你需要从许多可能的关系中找到现有的对并更新那个 - 除了用户之外,你还需要新的和旧的地址id标识。
update UserAddresses
set AddressId = @NewAddressId
where UserId = @UserId and @AddressId = @OldAddressId
答案 1 :(得分:0)
为什么要使用临时表?
CREATE PROCEDURE dbo.test
(
@UserId int,
@AddressId int
)
AS
update UserAddresses
set AddressId = @AddressIdD
WHERE UserId = @UserId
答案 2 :(得分:0)
tvanfossom正确地指出了代码中的问题。
使用上表,您的操作可以通过多种方式完成:
您使用哪一个取决于您在应用程序中的需求。我可能只是更新链接的地址,或者你需要保留原来的地址吗?