10

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

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

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

基本的に、私が探しているのは、次の例です。

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

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

3 TableA または TableB のいずれかで INSERT を実行し、次にジャンクション テーブルで適切な INSERT を実行して接続を確立する方法..

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

4

4 に答える 4

6

私が最初に行うことは、Linq-To-SqlNHibernateなどの ORM を使用することをお勧めします。これにより、データ モデルのオブジェクト表現が得られ、多対多の CRUD 操作などの複雑なものをより簡単に処理できるようになります。

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

ユーザー UserAddresses アドレス
======= ============= =========
ID ID ID
FirstName UserId 都市
LastName AddressId 状態
                              ジップ

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

   Users.Id -> UserAddresses.UserId
   Addresses.Id -> UserAddresses.AddressId
  • Addresses.Id に基づくユーザーのすべてのレコード
ユーザーを選択します。*
FROM アドレス INNER JOIN
                         UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN
                         ユーザー ON UserAddresses.UserId = Users.Id
WHERE (Addresses.Id = @AddressId)
  • Users.Id に基づく Addresses のすべてのレコード
住所を選択します。*
FROM アドレス INNER JOIN
                         UserAddresses ON Addresses.Id = UserAddresses.AddressId INNER JOIN
                         ユーザー ON UserAddresses.UserId = Users.Id
WHERE (Users.Id = @UserId)
于 2009-01-06T14:12:56.817 に答える
1

Bのキーに基づいてテーブルAのすべてのレコードを英語で取得するには、そのTableBキーを持つJoinレコードを持つテーブル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)  
于 2009-01-06T15:05:00.923 に答える
1
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 (...)
于 2009-01-06T14:00:39.400 に答える
0

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

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

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

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

于 2009-01-06T14:02:10.567 に答える