SQL mappage entre plusieurs tables
C'est un SQL question de conception. Tout d'abord, le programme d'installation. J'ai trois tables:
- Un, qui est automatiquement renseigné en fonction d'une requête sur un serveur lié. Les données de ce tableau ne peut pas être modifié;
- B, qui a seulement une douzaine de lignes, contenant les noms des collections de Comme;
- AtoB, qui est la table de mappage par qui Que sont organisés en collections nommées, avec les clés étrangères sur deux colonnes;
Par exemple, contient:
- Girafe
- Chouette
- Tigre
Et B contient:
- Seattle Zoo
- San Jose Zoo
Et AtoB contient:
1,1 (Girafe à Seattle)
2,1 (Hibou à Seattle)
3,1 (Tigre à Seattle)
2,2 (Hibou à San Jose)
Maintenant, le problème:
J'ai été invité à inclure dans certaines de ces collections éléments ne trouve pas dans A. Donc, j'ai créer une table, C, avec la même identité et le Nom de colonnes, et de le remplir. En accord avec l'exemple précédent, disons que C contient:
- Dragon
La question est, comment puis-je inclure des éléments de C dans AtoB? Que faire si j'ai besoin d'inclure un Dragon dans la région de Seattle Zoo?
Mon premier instinct, naïf, était de créer une vue V contenant de l'union de A et de C, et la modification de AtoB être VtoB. C'est là que ma naïveté a payé: on ne peut créer une clé étrangère à vue.
Je soupçonne qu'il y a une norme, corriger moyen d'une ou plus d'UNE OU C avec un B.
OriginalL'auteur Justin R. | 2010-01-11
Vous devez vous connecter pour publier un commentaire.
De s'étendre sur les Arthur de Thomas solution ici est un
union
sans la OÙ la les sous-sélections de sorte que vous pouvez créer une vue universelle:Ensuite, vous pouvez effectuer une requête comme:
OriginalL'auteur Kevin Peno
Si vous ne pouvez pas mettre un Dragon dans Un, alors vous aurez besoin de créer une autre table et une autre table de liaison. Le problème est la création d'un ensemble unique de données qui doivent être stockées (une autre table) qui ne peut pas être le même jeu comme A. comme il n'est pas le même jeu, alors vous ne pouvez plus utiliser la table de liaison (AtoB) qui a les clés étrangères que de s'assurer que le lien est une référence du jeu de A. Donc, vous pouvez créer une table comme ceci:
imaginary_creatures
imaginary_creatures_to_b
Plus tard, lorsque vous souhaitez obtenir toutes les créatures dans un zoo, vous pouvez faire une UNION
Il peut y avoir une meilleure façon de l'écrire, mais il doit travailler pour vos besoins.
imaginary_creatures_to_c
devrait êtreimaginary_creatures_to_b
je penseOriginalL'auteur Arthur Thomas
Arthur Thomas a une bonne solution, l'autre solution possible est d'ajouter une colonne à la table de lien indiquant la table (A ou C) elle est liée. Puis appliquer les relations par le biais de déclencheurs plutôt que de clés étrangères. Mais vraiment Arthur solution est la meilleure façon de faire ce genre de chose.
OriginalL'auteur HLGEM
Ce que vous voulez faire est de mettre de Dragon dans Un, et si vous souhaitez sélectionner TOUS les enregistrements d'Une indépendamment de s'ils ont un enregistrement correspondant dans AtoB, faire une JOINTURE EXTERNE GAUCHE. Quelque chose comme ceci:
Edit: Cela ne fonctionne que si vous pouvez ajouter vos nouveaux enregistrements à A. j'ai raté le fait que vous n'êtes pas en mesure de. Je pense que Arthur de Thomas solution est ce que vous voulez.
ah, merci totalement raté.
OriginalL'auteur rosscj2533