質問
うわー、このトピックの簡単な説明を見つけるのは難しいです。単純な多対多の関係。
3つのテーブル、tableA、tableB、ジャンクションtableA_B。
キーとすべての関係を設定する方法は知っていますが、INSERT、UPDATE、およびDELETEクエリを実行するときが来ると少し混乱します。
基本的に、私が探しているのは以下を示す例です:
-
TableBのIDに基づいてTableAのすべてのレコードを取得する方法
-
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演算子を使用しないでください