Página inicial  

Tema 6. Actualización de datos (II)


Insertar varias filas INSERT INTO...SELECT


Podemos insertar en una tabla varias filas con una sola sentencia SELECT INTO si los valores a insertar se pueden obtener como resultado de una consulta, en este caso sustituimos la cláusula VALUES lista de valores por una sentencia SELECT como las que hemos visto hasta ahora. Cada fila resultado de la SELECT forma una lista de valores que son los que se insertan en una nueva fila de la tabla destino. Es como si tuviesemos una INSERT...VALUES por cada fila resultado de la sentencia SELECT.

La sintaxis es la siguiente:

El origen de la SELECT puede ser el nombre de una consulta guardada, un nombre de tabla o una composición de varias tablas ( mediante INNER JOIN, LEFT JOIN, RIGHT JOIN o producto cartesiano).

Cada fila devuelta por la SELECT actúa como la lista de valores que vimos con la INSERT...VALUES por lo que tiene las mismas restricciones en cuanto a tipo de dato, etc. La asignación de valores se realiza por posición por lo que la SELECT debe devolver el mismo número de columnas que las de la tabla destino y en el mismo orden, o el mismo número de columnas que indicamos en la lista de columnas después de destino.

Las columnas de la SELECT no tienen porque llamarse igual que en la tabla destino ya que el sistema sólo se fija en los valores devueltos por la SELECT.

Si no queremos asignar valores a todas las columnas entonces tenemos que indicar entre paréntesis la lista de columnas a rellenar después del nombre del destino.

El estándar ANSI/ISO especifica varias restricciones sobre la consulta que aparece dentro de la sentencia INSERT:

la consulta no puede tener una cláusula ORDER BY,

la tabla destino de la sentencia INSERT no puede aparecer en la cláusula FROM de la consulta o de ninguna subconsulta que ésta tenga. Esto prohibe insertar parte de una tabla en sí misma,

la consulta no puede ser la UNION de varias sentencias SELECT diferentes,

el resultado de la consulta debe contener el mismo número de columnas que las indicadas para insertar y los tipos de datos deben ser compatibles columna a columna.

Sin embargo en SQL de Microsoft Jet,

se puede incluir la cláusula ORDER BY aunque no tiene mucho sentido.

se puede
poner
en la cláusula FROM de la consulta, la tabla en la que vamos a insertar,

pero no podemos utilizar una UNION.

 

Ejemplo: Supongamos que tenemos una tabla llamada repres con la misma estructura que la tabla empleados, y queremos insertar en esa tabla los empleados que tengan como titulo rep ventas

INSERT INTO repres SELECT * FROM empleados WHERE titulo = 'rep ventas'

Con la SELECT obtenemos las filas correspondientes a los empleados con título rep ventas,y las insertamos en la tabla repres. Como las tablas tienen la misma estructura no hace falta poner la lista de columnas y podemos emplear * en la lista de selección de la SELECT.

Ejemplo: Supongamos ahora que la tabla repres tuviese las siguientes columnas numemp, oficinarep, nombrerep. En este caso no podríamos utilizar el asterisco, tendríamos que poner:

INSERT INTO repres SELECT numemp, oficina, nombre FROM empleados WHERE titulo = 'rep ventas'

O bien:

INSERT INTO repres (numemp, oficinarep, nombrerep) SELECT numemp, oficina, nombre FROM empleados WHERE titulo = 'rep ventas'



 
Pag.6.2
© aulaClic. Todos los derechos reservados. Free Computer tutorials . Prohibida la reproducción por cualquier medio.
Julio-2001.aulaClic.com