0

これは、これに対するフォローアップの質問です。

多対多の関係におけるクエリの例

ジャンクションテーブルの更新について。これを行うには、接合テーブルの WHERE 句で両方のキー値を使用する必要があります。

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

たとえば、この例では、ユーザーが住所を変更したため、UserAddresses テーブルの AddressId フィールドを更新したいとします。update 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

これは、実際には多対 1 の関係のように見えます。そうでない場合は、変更を行うために古いアドレス ID と新しいアドレス ID およびユーザー ID が必要になります。多対 1 の関係の場合は、ユーザー ID ごとにユーザー ID/アドレス ID のペアが 1 つしか存在しないため、単純な更新でうまくいくはずです。

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

それが本当に多対多の関係である場合は、多くの可能性のあるペアから既存のペアを見つけて更新する必要があります。これには、ユーザー ID に加えて、新しいアドレス 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 はあなたのコードの問題を正しく指摘したと思います。

上記の表を使用すると、操作はさまざまな方法で実行できます。

  • 新しいアドレスへのリンクを INSERT し、古いアドレスへのリンクを DELETE して、リンク先のアドレス レコードを保持または削除します。
  • tvanfossom が説明したようにリンク レコードを更新します (LuckyLindys クエリは、ユーザーのすべての登録済みアドレスを同じアドレスに設定します)。
  • リンク先の住所レコードを更新します。

どちらを使用するかは、アプリケーションに何を求めるかによって異なります。リンクされたアドレスを更新するか、古いアドレスを保持する必要がありますか?

于 2009-02-22T15:12:37.803 に答える