2010-01-21 8 views
11

Ho due tabelle esistenti, con campi diversi, ad eccezione di ID primario (un varchar, non un int). Voglio creare una terza tabella che è essenzialmente un'unione di questi due, in modo tale che per una data chiave primaria ho tutti i campi in una tabella.MySQL - Come creare una nuova tabella che è un join su chiave primaria di due tabelle esistenti

Qual è il modo migliore per farlo?

Molte grazie

+1

Sei sicuro di volere una tabella (che contiene un'istantanea dei dati attuali nelle tabelle e non rifletteranno i cambiamenti futuri)? Non stai cercando una vista (che guarda sempre i dati correnti nelle tabelle)? –

+0

Ciao Bandi-T - questo è un buon pensiero, e infatti a pensarci forse non ho bisogno di unirli. Tuttavia, i dati sono ragionevolmente statici, saranno aggiornati solo in lotti ogni mese o giù di lì. –

+0

bene, se si sceglie una tabella, il DBMS calcola solo una volta e non segue le modifiche nei dati di origine. Se si sceglie una vista, il DBMS calcola ogni volta che qualcuno interroga quella vista, ma conterrà sempre nuovi dati. Se si devono eseguire molte query su questi dati uniti (suppongo che interrogherete più spesso di quanto accadano gli aggiornamenti), allora potrebbe valere la pena di scegliere di usare una tabella. –

risposta

2

Se si è sicuri di avere uno ed esattamente una riga in entrambe le tabelle per un dato ID primario, allora questo dovrebbe funzionare:

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 

Si potrebbe voler omettere TableA e di TableB di campo ID primario dall'elenco dei campi se non ne hai effettivamente bisogno (in questa query entrambi conterranno lo stesso valore a causa della condizione tablea.primaryID = tableb.primaryID).

La sintassi è relativamente simile per uno VIEW.

+0

Sì, sono abbastanza sicuro che c'è una sola riga per un dato PID in ogni tabella. Il PID è impostato come PRIMARY KEY - presumibilmente MySQL si sarebbe importato se fosse stato duplicato? –

+0

@Richard: Sì, lo farebbe. Tuttavia, per la query sopra riportata per dare tutte le tue righe esattamente una volta, devi anche assicurarti che le righe (record) possano corrispondere esattamente 1: 1 le une alle altre nelle due tabelle.Se hai una chiave primaria di dire 3 in una tabella, ma non c'è una chiave primaria 3 nell'altra tabella, non ci sarà alcuna riga con quel '3' nel risultato, perché non c'è nessuna riga' 3' corrispondente nella altro tavolo. –

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

per ottenere una vista, fare lo stesso, tranne sostituire "TAVOLO" con "VIEW". Se vai con la tabella piuttosto che con la vista, assicurati di aggiungere una chiave primaria che non verrà aggiunta per impostazione predefinita.

+0

Risposta accurata! – HPM

0

Perché stai creando un nuovo tavolo? Perché non esegui una query solo quando hai bisogno dei dati? Se stai semplicemente unendo due tabelle sulla loro chiave primaria, allora la maggior parte del tuo tempo di accesso ai dati verrà speso per il ritrasferimento dei dati alla tua applicazione. Non risparmierai molto tempo prima di unirti ai tavoli e mangerai molto spazio. Inoltre, stai mirando all'alluce, aspettando solo la prima volta che aggiorni le tue tabelle di origine e dimentichi di eseguire lo script di aggiornamento per copiare le modifiche alla tabella unita. I dati duplicati sono malvagi, ma a volte è necessario. Questo non sembra uno di quei tempi.

0

Per MS SQL utilizzare questo

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