12
votes

MySQL - Comment créer une nouvelle table qui est une jointure sur la clé primaire de deux tables existantes

J'ai deux tables existantes, avec différents champs, à l'exception de l'ID primaire (A varchar , pas un int ). 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.

Comment cela peut-il être fait?


5 commentaires

Ê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.


4 Réponses :


3
votes

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


2 commentaires

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 dans le résultat, car il n'y a pas de correspondance < Code> 3 rangée dans l'autre table.



35
votes
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.

0 commentaires

-3
votes

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 , mais parfois c'est nécessaire. Cela ne ressemble pas à l'un de ces moments.


0 commentaires

0
votes

pour MS SQL Utilisez cette

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


0 commentaires