質問

うわー、このトピックの簡単な説明を見つけるのは難しいです。単純な多対多の関係。

3つのテーブル、tableA、tableB、ジャンクションtableA_B。

キーとすべての関係を設定する方法は知っていますが、INSERT、UPDATE、およびDELETEクエリを実行するときが来ると少し混乱します。

基本的に、私が探しているのは以下を示す例です:

  1. TableBのIDに基づいてTableAのすべてのレコードを取得する方法

  2. TableAのIDに基づいてTableBのすべてのレコードを取得する方法

3 TableAまたはTableBに挿入し、ジャンクションテーブルに適切なINSERTを行って接続を作成する方法。

特定のプロジェクトの解決策を探しているのではなく、適用できる一般的な例をいくつか探しています。たぶん何かが横たわっていますか?

役に立ちましたか?

解決

最初に行うことは、 Linq-To-のようなORMを使用することです。 Sql または NHibernate は、それを作成するデータモデルのオブジェクト表現を提供します多対多のCRUD操作などの複雑な処理を簡単に処理できます。

ORMがツールセットの一部ではない場合、SOLでこれがどのように表示されるかを次に示します。

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

テーブルは次のように結合されます:

   Users.Id -> UserAddresses.UserId
   Addresses.Id -> UserAddresses.AddressId
  • Addresses.Idに基づくユーザーのすべてのレコード
SELECT        Users.*
FROM            Addresses INNER JOIN
                         UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN
                         Users ON UserAddresses.UserId = Users.Id
WHERE        (Addresses.Id = @AddressId)
  • Users.Idに基づくアドレスのすべてのレコード
SELECT        Addresses.*
FROM            Addresses INNER JOIN
                         UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN
                         Users ON UserAddresses.UserId = Users.Id
WHERE        (Users.Id = @UserId)

他のヒント

SELECT *
FROM a
WHERE id IN (SELECT aid FROM ab WHERE bid = 1234)

または

SELECT a.*
FROM a
JOIN ab ON a.id = ab.aid
WHERE ab.aid = 12345

挿入するには、データベースに依存します(たとえば、主キーがシーケンスからのものであるか、自動生成されるか、他の方法で生成されるか、単に複合キーであるかなど)。ただし、必要なのは次のとおりです。

そのデータの場合:

INSERT INTO a VALUES (...)

関係について:

INSERT INTO ab VALUES (...)

英語のBのキーに基づいてテーブルAのすべてのレコードを取得するには、そのテーブルBキーを持つ結合レコードを持つテーブルAのレコードが必要です。 (tableA_Bには2つの外部キー列(TabAFKおよびTabBFK)があると仮定します

  Select * from TableA A
  Where pK In (Select Distinct TabAFK From tableA_B
                Where TabBFK = @TableBKeyValue)

他の方向についても同じこと

  Select * from TableB B
  Where pK In (Select Distinct TabBFK From tableA_B
                Where TabAFK = @TableAKeyValue)

新しいレコードを挿入するには、必要に応じてTableAおよびTableBに通常の挿入を行います...結合テーブル(tableA_B)への挿入は、2つのメインテーブルからの2つのPKのみです

   Insert TableA (pk, [other columns]) Values(@pkValue,  [other data)
   Insert TableB (pk, [other columns]) Values(@pkValue,  [other data)

-次に、存在する関連付けごとに結合テーブルに挿入します...

  Insert tableA_B (TabAFK, TabBFK)  Values(@PkFromA,  @PkFromB)  

1) tableA.id = tableA_B.idAでtableA_BをtableA_Bに結合し、tableAからtableA。*を選択します。 ここで、tableA_B.idB = somevalue

2) tableBからtableB。*を選択します。tableB.idのtableA_Bを左結合します= tableA_B.idB ここで、tableA_B.idA = somevalue

3)挿入はデータベースによって異なりますが、aに挿入し、bに挿入してからa_bに挿入します。テーブルに制約がある場合でも、そのように動作するはずです。

ヒント:1/2にはIN演算子を使用しないでください

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top