Question

Wow, il est difficile de trouver une explication simple à ce sujet. Une relation simple et multiple.

Trois tables, tableA, tableB et une table de jonction A_B.

Je sais comment configurer la relation, avec les clés et tout, mais je suis un peu confus au moment d'effectuer des requêtes INSERT, UPDATE et DELETE ....

En gros, ce que je recherche, c’est un exemple qui montre:

  1. Comment obtenir tous les enregistrements dans TableA, en fonction d'un identifiant dans TableB

  2. Comment obtenir tous les enregistrements de la table B, en fonction d'un identifiant de la tableA

3 Comment insérer dans TableA ou TableB, puis créer l’INSERT approprié dans la table de jonction pour établir la connexion.

Je ne cherche pas de solution à un projet spécifique, mais quelques exemples généraux pouvant être appliqués. Peut-être que vous avez quelque chose traîner?

Était-ce utile?

La solution

La première chose à faire est de recommander un ORM tel que Linq-To- Sql ou NHibernate qui vous donnera des représentations d'objet de votre modèle de données qui en font beaucoup plus simple de gérer des choses complexes telles que plusieurs opérations CRUD.

Si un ORM ne fait pas partie de votre jeu d’outils, voici comment cela se présenterait dans SOL.

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

Nos tables sont jointes comme suit:

   Users.Id -> UserAddresses.UserId
   Addresses.Id -> UserAddresses.AddressId
  • Tous les enregistrements des utilisateurs basés sur Adresses.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)
  • Tous les enregistrements dans les adresses basées sur 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)

Autres conseils

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

ou

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

Pour insérer, cela dépend de votre base de données (par exemple, si les clés primaires sont des séquences, générées automatiquement ou autrement, ou simplement des clés composites). Mais vous avez juste besoin de:

Pour ces données:

INSERT INTO a VALUES (...)

Pour la relation:

INSERT INTO ab VALUES (...)

Pour obtenir tous les enregistrements de la table A basés sur la clé en B, vous souhaitez que les enregistrements de la table A possèdent un enregistrement Join avec cette clé TableB (Supposons que la table A_B comporte deux colonnes de clé étrangère (TabAFK et TabBFK)

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

Même chose pour une autre direction

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

Pour insérer un nouvel enregistrement, effectuez une insertion normale dans TableA et TableB selon vos besoins ... Les insertions dans la table de jointure (tableA_B) ne sont que les deux pks des deux tables principales

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

- Ensuite, insérez-le dans la table Join pour chaque association existante ...

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

1) sélectionnez tableA. * à partir de tableA rejoindre tableA_B sur tableA.id = tableA_B.idA où tableA_B.idB = valeur partielle

2) sélectionnez tableB. * de la tableB jointure gauche tableA_B sur tableB.id = tableA_B.idB où tableA_B.idA = valeur partielle

3) insert dépend de votre base de données, mais insère dans a, insère dans b, puis insère dans a_b; même avec des contraintes sur les tables, cela devrait fonctionner ainsi.

indice: n'utilisez pas l'opérateur IN pour 1/2

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top