J'ai deux tables existantes, avec différents champs, à l'exception de l'ID primaire (A Comment cela peut-il être fait? P> varchar code>, pas un
int code>). Je veux créer une troisième table qui est essentiellement une fusion de ces deux, telle que pour une clé primaire donnée, j'ai tous les champs d'une table. P>
4 Réponses :
Si vous êtes sûr que vous en avez une et exactement une ligne dans les deux tables d'un identifiant principal donné, cela devrait alors fonctionner:
SELECT tablea.field1, tablea.field2, tablea.field3, ... tablea.fieldn, <---- field list tableb.field1, tableb.field2, tableb.field3, ... tableb.fieldm <---- field list FROM tablea, tableb WHERE tablea.primaryID = tableb.primaryID
Oui Assez sûr qu'il n'y a qu'une seule rangée pour un PID donné dans chaque table. Le PID est défini comme clé primaire - probablement MySQL Barf à l'importation s'il y avait dupe?
@Richard: Oui, ça le ferait. Cependant, pour la requête ci-dessus pour donner toutes vos lignes exactement une fois, vous devez également vous assurer que les lignes (enregistrements) peuvent être adaptées exactement 1: 1 dans les deux tables. Si vous avez une clé primaire de dire 3 dans une table d'une, mais il n'y a pas de clé primaire 3 dans l'autre table, il n'y aura pas de ligne avec ce 3 code> dans le résultat, car il n'y a pas de correspondance < Code> 3 code> rangée dans l'autre table.
CREATE TABLE result AS (SELECT first.*, second.f1, second.f2, second.f3 FROM first INNER JOIN second ON first.id = second.id); To get a view, do the same except replace "TABLE" with "VIEW". If you go with the table rather than the view, make sure to add a primary key as that will not be added by default.
Pourquoi créez-vous une nouvelle table? Pourquoi n'exécutez-vous pas simplement une requête chaque fois que vous avez besoin des données? Si vous vous joignez simplement à deux tables sur leur clé principale, la majorité de votre temps d'accès aux données sera consacré à la remise des données sur votre candidature. Vous n'allez pas économiser beaucoup de temps pré-rejoindre les tables et vous mangerez beaucoup d'espace. De plus, vous prenez votre objectif à votre gros orteil, vous attendez simplement pour la première fois que vous mettez à jour vos tables source et oubliez d'exécuter votre script de mise à jour pour copier les modifications apportées à votre table jointe. Les données en double sont le mal em>, mais parfois c'est nécessaire. Cela ne ressemble pas à l'un de ces moments. P>
pour MS SQL Utilisez cette
SELECT * INTO result FROM table1 INNER JOIN table2 ON table1.id = table2.id
Êtes-vous sûr de vouloir une table (qui contient un instantané de données actuelles dans vos tables et ne reflétera pas les changements futurs)? Vous ne cherchez pas une vue (qui regarde toujours les données actuelles des tables)?
Bonjour Bandi-T - C'est une bonne pensée et en réfléchissant, peut-être que je n'ai pas besoin de les fusionner. Cependant, les données sont raisonnablement statiques, ne seront mises à jour que par lot chaque mois.
Eh bien, si vous choisissez une table, le SGBM ne calcule qu'une fois et ne suive pas les modifications apportées aux données de la source. Si vous choisissez une vue, le SGBD calcule chaque fois que quelqu'un intervient que la vue, mais elle contiendra toujours de nouvelles données. Si vous devez effectuer de nombreuses questions sur cette donnée fusionnée (je suppose que vous allez interroger plus souvent que les mises à jour qui se produisent), il vaut peut-être très bien de choisir d'utiliser une table.
@ BANDI-T - Ouais, il sera interrogé beaucoup plus fréquemment que mis à jour. Cependant, les ensembles de données sont largish, afin que je puisse me sauver une certaine douleur et aller avec le modèle de vue quand même
Oui, je me sentirais mieux avec cela - voir la réponse de TMN ci-dessous. Bien sûr, la largeur et la hauteur des tables sont également en ce genre, ainsi que sur le type de requêtes que vous aurez. Et puis nous n'avons même pas commencé à envisager d'ajouter des index pour accélérer les requêtes.