Обновить таблицу соединений в отношениях «многие ко многим» - PullRequest
0 голосов
/ 22 февраля 2009

Это дополнительный вопрос к этому:

Примеры запросов в отношении многие ко многим

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

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

Например, в этом примере, скажем, я хотел обновить поле AddressId в таблице UserAddresses, потому что пользователь изменил свой адрес. Мне бы пришлось использовать как существующий UserId, так и адрес AddressId в предложении обновления 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, кажется, что-то идет не так.

Есть мысли?

Ответы [ 3 ]

1 голос
/ 22 февраля 2009

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

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

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

update UserAddresses
set AddressId = @NewAddressId
where UserId = @UserId and @AddressId = @OldAddressId
0 голосов
/ 22 февраля 2009

tvanfossom правильно указал на проблему в вашем коде, я думаю.

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

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

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

0 голосов
/ 22 февраля 2009

Зачем использовать временную таблицу?

CREATE PROCEDURE dbo.test
(
@UserId int,
@AddressId int
)
AS
update UserAddresses
set AddressId = @AddressIdD
WHERE UserId = @UserId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...