2010-01-21 13 views
11

Tengo dos tablas existentes, con diferentes campos, a excepción de Identificación Primaria (un varchar, no un int). Quiero crear una tercera tabla que es esencialmente una fusión de estas dos, de modo que para una clave principal dada tengo todos los campos en una tabla.MySQL - Cómo crear una nueva tabla que es una combinación de clave principal de dos tablas existentes

Cuál es la forma bext de hacer esto?

Muchas gracias

+1

¿Seguro que quieres una mesa (que contiene una instantánea de los datos actuales de las tablas y no reflejar los cambios futuros)? ¿No estás buscando una vista (que siempre mira los datos actuales en las tablas)? –

+0

Hola Bandi-T: es una buena idea, y de hecho pensar en ello tal vez no es necesario fusionarlos. Sin embargo, los datos son razonablemente estáticos, solo se actualizarán en lotes cada mes más o menos. –

+0

, si elige una tabla, el DBMS solo calcula una vez y no sigue los cambios en los datos de origen. Si elige una vista, el DBMS calcula cada vez que alguien consulta esa vista, pero siempre contendrá datos nuevos. Si tiene que realizar muchas consultas sobre este fusionó datos (supongo que va a consultar con más frecuencia que suceden los cambios), entonces puede muy bien ser vale la pena elegir utilizar una tabla. –

Respuesta

2

Si está seguro de que tiene uno y exactamente una fila en ambas tablas para una identificación primaria dada, entonces esto debería funcionar:

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 

Es posible que desee omitir TableA de y de TableB campo ID primario de la lista de campos si no los necesita (en esta consulta ambos contendrán el mismo valor debido a la condición tablea.primaryID = tableb.primaryID).

La sintaxis es relativamente similar para un VIEW también.

+0

Sí, estoy bastante seguro de que solo hay una fila para un PID determinado en cada tabla. El PID está configurado como PRIMARY KEY. ¿Supuestamente MySQL descartaría la importación si hubiera un dupe? –

+0

@Richard: Sí, lo haría. Sin embargo, para que la consulta anterior dé todas sus filas exactamente una vez, también debe asegurarse de que las filas (registros) se puedan emparejar exactamente 1: 1 entre sí en las dos tablas.Si tiene una clave principal de, digamos, 3 en una tabla, pero no hay una clave principal 3 en la otra tabla, no habrá una fila con ese '3' en el resultado, porque no hay una fila' 3' coincidente en el otra mesa –

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

Para obtener una vista, haga lo mismo excepto que reemplace "TABLE" con "VIEW". Si va con la tabla en lugar de la vista, asegúrese de agregar una clave principal, ya que no se agregará de forma predeterminada.

+0

¡Respuesta precisa! – HPM

0

Por qué estás creando una nueva tabla? ¿Por qué no ejecutas una consulta cada vez que necesitas los datos? Si solo está uniendo dos tablas en su clave principal, la mayor parte de su tiempo de acceso a datos se utilizará para reunir los datos en su aplicación. No ahorrará mucho tiempo antes de unirse a las mesas, y estará comiendo mucho espacio. Además, apuntas al dedo gordo del pie, solo esperas la primera vez que actualizas tus tablas de origen y te olvidas de ejecutar tu script de actualización para copiar los cambios en tu tabla unida. Los datos duplicados son evil, pero a veces es necesario. Esto no suena como uno de esos momentos.

0

Para MS SQL utilizan este

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