Update Junction стол во многих-ко-многим


0

Это прослеживание вопрос к этому:

Query examples in a many-to-many relationship

относительно обновления таблицы перехода. Для этого мне пришлось бы использовать оба значения ключа в таблице соединений в предложении WHERE.

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

В этом примере, например, сказать, что я хотел, чтобы обновить поле AddressID в таблице UserAddresses, поскольку пользователь изменил свой адрес. Мне нужно было бы использовать как существующий UserId, так и адрес AddressId в предложении update WHERE.

Я использую хранимую процедуру и передаю в 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

Это на самом деле выглядит как отношения «один-к-одному». Если вам не нужен идентификатор старого адреса, а также новый идентификатор адреса и идентификатор пользователя, чтобы внести изменения. Если это многие к одному отношениям, то простое обновление должно работать, так как только один идентификатор пользователя/адрес пара идентификаторов будет существовать для каждого идентификатора пользователя:

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 в таблице temp, а затем обратиться к этой таблице в текущем обновлении. Я думаю, что это должно быть возможно, но я не могу получить синтаксис правильно. 22 фев. 092009-02-22 16:09:55

  0

Да, но вы выбираете только UserID в таблице temp. Если у пользователя может быть много адресов, вам нужно найти пару, соответствующую старому адресу, который удаляется, и заменить его. 22 фев. 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 указал, что проблема в вашем коде правильно, я думаю.

С учетом указанными выше таблицами, ваша работа может быть сделана различными способами:

  • ВСТАВИТЬ ссылку на новый адрес и удалить ссылку на старый адрес, либо хранение или удаление записи адреса, который будучи связан к.
  • ОБНОВЛЯЙТЕ запись ссылки, как описано tvanfossom (запрос LuckyLindys будет устанавливать все зарегистрированные адреса пользователя на один и тот же).
  • ОБНОВЛЯЙТЕ адресную запись, к которой привязаны.

Какой из них вы используете, зависит от того, что вы хотите в своем приложении. Возможно, я просто обновил связанный адрес, или вам нужно сохранить старый?