2009-01-14 21 views
35

Intenté buscar aquí una solución similar pero no vi ninguna, así que me preguntaba cuál es la mejor manera de lograr lo siguiente.Insertar fila en la tabla para cada identificación en otra tabla

Tengo una tabla con más de 17 millones de filas, todas tienen una identificación única. Recientemente hemos creado una nueva tabla que se utilizará junto con la tabla anterior donde la clave externa de la nueva tabla es el ID único de la tabla anterior.

Por ej.
Tabla 1 - Identificación, campo1, campo2, field3 ... tabla 2 - table1.id, campo1 ...

El problema está ya estamos migrando esto en un entorno real, tenemos que hacer una copia de llenar la tabla 2 con una fila que contiene el ID de la tabla 1 para cada fila en la tabla 1. ex, tabla 1 - 1, prueba, nulo tabla 2 ahora necesita tener: 1, nulo, ... y así sucesivamente para cada fila que está en la tabla1. El problema principal es que los identificadores no son todos secuenciales en la tabla 1, así que tendremos que leer de la tabla 1 y luego insertar basados ​​en el ID de encontrado en la tabla 2.

¿Hay alguna manera más fácil de hacerlo? Gracias de antemano Joe

también para aclarar, la tabla 2 serán los nuevos datos y la única cosa que contendrá la tabla 1 es el identificador para mantener la relación de clave externa

También este es el servidor SQL 2000

Respuesta

4

Necesita leer este artículo.

What are the most common SQL anti-patterns?

El principal problema es que los identificadores no son todos secuencial en la tabla 1, así que tendrá que leer de la tabla 1 y luego insertar en base de la identificación del encontrado en la tabla 2

Sí, mira mi respuesta en el artículo anterior y escribe un bucle para caminar con la tecla usando el ítem n. ° 2.

Al escribir el enunciado de inserción, asegúrese de proporcionar una lista de campos, como ya dije en el Artículo # 1.

11

No estoy seguro de que te estoy siguiendo exactamente, pero algo como esto funcionaría para ti?

INSERT INTO table2 (SELECT field1, field2, field3... FROM table1) 

Si entiendo correctamente desea un registro en table2 para cada registro en table1. Esto hará exactamente eso. Simplemente haga coincidir sus campos en la selección en el orden correcto y especifique constantes para cualquier campo de la tabla 2 que no tenga en la tabla1.

HTH. Avísame si no entiendo y trataré de ayudar de nuevo.

+0

¿Esto funciona de sintaxis en el servidor SQL? Al intentarlo, me sale un error que dice "Error cerca de SELECCIONAR" – Trevor

+0

sí, esto también debería funcionar para el servidor sql. Cree una pregunta con su sintaxis que arroje un error y envíe un enlace si lo desea. –

+8

Para hacer que funcione en SQL Server, tuve que escribir: INSERT INTO table2 (field1, field2, field3) SELECT field1, field2, field3 FROM table1 – ConnorsFan

-1

Con tantas filas, puede tener problemas con el espacio de registro de transacciones y el tiempo de ejecución de grandes transacciones de inserción.

Si el tiempo de ejecución es una restricción que recomiendo seriamente el uso Bcp (o lo que sea herramienta es aplicable dependiendo de la plataforma)

Seleccionar los identificadores de la tabla original, utilizar eso para crear un archivo de BCP la tabla de extensión, luego Bcp en.

Muchos lo encuentran más eficiente para Bcp en archivos de 10,000 registros en lugar de un archivo humungus con 17,000,000 filas.

Además, puede hacer esto en segundo plano antes de la puesta en marcha, y escribir un trabajo de t-sql para recoger y que puede haber sido insertado después de tomar la instantánea de los identificadores.

44

Si entiendo correctamente, quiere un registro en la tabla 2 para cada registro en la tabla1. También creo que, aparte de la referencia a la tabla 1, la tabla 2 inicialmente debería contener filas en blanco.

Así que asumiendo

table1 (ID, field1, field2, ...) 
table2 (ID, table1_ID, fieldA, fieldB,...) 
-- where table1_ID is a reference to ID of table1 

Después de crear tabla2 simplemente puede ejecutar esta instrucción de inserción

insert into table2(table1_ID) 
select ID from table1 
Cuestiones relacionadas