2010-01-21 13 views
11

J'ai deux tables existantes, avec des champs différents, à l'exception de Primary ID (un varchar, pas un int). Je veux créer une troisième table qui est essentiellement une fusion de ces deux, de sorte que pour une clé primaire donnée, j'ai tous les champs dans une table.MySQL - Comment créer une nouvelle table qui est une jointure sur la clé primaire de deux tables existantes

Quelle est la manière de faire ceci?

Un grand merci

+1

Êtes-vous sûr que vous voulez une table (qui contient un instantané des données actuelles dans vos tableaux et ne tiendra pas compte des changements futurs)? N'êtes-vous pas à la recherche d'une vue (qui regarde toujours les données actuelles dans les tableaux)? –

+0

Salut Bandi-T - c'est une bonne idée, et en fait en y réfléchissant peut-être que je n'ai pas besoin de les fusionner. Cependant, les données sont raisonnablement statiques et ne seront mises à jour que par lots tous les mois. –

+0

bien, si vous choisissez une table, le SGBD ne calcule qu'une seule fois et ne suit pas les changements dans les données source. Si vous choisissez une vue, le SGBD calcule chaque fois que quelqu'un interroge cette vue, mais il contiendra toujours de nouvelles données. Si vous devez effectuer de nombreuses requêtes sur ces données fusionnées (je suppose que vous interrogerez plus souvent que les mises à jour), il peut être utile de choisir une table. –

Répondre

2

Si vous êtes sûr que vous en avez un et exactement une ligne dans les deux tables pour une identification primaire donné, cela devrait 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 

Vous pourriez vouloir omettre de ce TableA et TABLEB champ ID primaire de la liste des champs si vous n'en avez pas réellement besoin (dans cette requête, les deux contiendront la même valeur en raison de la condition tablea.primaryID = tableb.primaryID).

La syntaxe est relativement similaire pour un VIEW.

+0

Oui assez sûr qu'il n'y a qu'une seule ligne pour un PID donné dans chaque table. Le PID est défini comme PRIMARY KEY - vraisemblablement, MySQL serait importé s'il y avait dupe? –

+0

@Richard: Oui, ce serait le cas. Cependant, pour que la requête ci-dessus donne toutes vos lignes exactement une fois, vous devez également vous assurer que les lignes (enregistrements) peuvent être exactement 1: 1 l'une par rapport à l'autre dans les deux tables.Si vous avez une clé primaire de dis 3 dans une table, mais il n'y a pas de clé primaire 3 dans l'autre table, il n'y aura pas de ligne avec ce '3' dans le résultat, parce qu'il n'y a pas de ligne' 3' correspondante dans le autre table –

26
CREATE TABLE result AS 
    (SELECT first.*, 
      second.f1, 
      second.f2, 
      second.f3 
    FROM first 
      INNER JOIN second 
        ON first.id = second.id); 

Pour obtenir une vue, faites de même, sauf remplacer "TABLE" par "VUE". Si vous utilisez la table plutôt que la vue, assurez-vous d'ajouter une clé primaire car elle ne sera pas ajoutée par défaut. Pourquoi est-ce que vous créez une nouvelle table?

+0

Réponse précise! – HPM

0

Pourquoi ne pas simplement exécuter une requête chaque fois que vous avez besoin des données? Si vous venez de joindre deux tables sur leur clé primaire, la majorité de votre temps d'accès aux données va être utilisé pour ramener les données à votre application. Vous n'économiserez pas beaucoup de temps avant de rejoindre les tables, et vous mangerez beaucoup d'espace. De plus, vous ciblez votre gros orteil, en attendant la première fois que vous mettez à jour vos tables source et oubliez d'exécuter votre script de mise à jour pour copier les changements dans votre table jointe. Les données en double sont mal, mais parfois c'est nécessaire. Cela ne ressemble pas à l'un de ces moments.

0

Pour MS SQL utiliser cette

SELECT * INTO result 
FROM table1 
INNER JOIN table2 
ON table1.id = table2.id