Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: doreymis en 8 Junio 2010, 15:21 pm



Título: insert y subconsultas en mysql
Publicado por: doreymis en 8 Junio 2010, 15:21 pm
hola a todos...

queria saber si existe una manera de insertar un mismo valor a todos los registros de una tabla usando una sub consulta. en mi ejemplo, insertar una misma fecha y hora de entrada para todos los empleados de la tabla empleado.

esta es la estructura de mis 2 tablas

tabla empleado:
ci
1
2
3
nombre
pedro
x
y
apellido
perez
x
y

tabla asistencia:
fechacihoraEhoraS

esta es la sentencia que estoy usando (la que mejor se me ocurrio jeje)
Código:
insert into asistencia values ("2010-06-07",(select empleado.ci from empleado),"08:00:00",horaS)

el error que me da es que la sub consulta me devuelve mas de un valor. me gustaria que pudieran indicarme como hacerlo correctamente.



Título: Re: insert y subconsultas en mysql
Publicado por: novalida en 8 Junio 2010, 16:00 pm
Hola,
podrías explicar un poco mejor eso de

insertar un mismo valor a todos los registros de una tabla

¿Lo que quieres es "insertar" todos los empleados de la tabla EMPLEADO en la tabla ASISTENCIA? Si es esto lo que quieres hacer:

  • 1º Crea un procedimiento en el que extraigas el contenido de la subconsulta de la tabla EMPLEADO a un cursor.
  • 2º  Recorre dicho cursor en un bucle en el cual se lleve a cabo la operación de inserción en la tabla ASISTENCIA.
Espero que te haya sido de utilidad. En cualquier caso aquí estaré por si se te puede echar una mano :)

Un saludo.


Título: Re: insert y subconsultas en mysql
Publicado por: ssccaann43 © en 8 Junio 2010, 17:22 pm
Código
  1.  
  2. INSERT INTO asistencia(ci,fecha,horaE,horaS) (SELECT empleado.ci,[2010-06-07] AS Fecha,[08:00:00] AS horaE,[12:00:00] AS HoraS FROM empleado)
  3.  
  4.  

Saludos  ;D


Título: Re: insert y subconsultas en mysql
Publicado por: doreymis en 8 Junio 2010, 20:45 pm
lo que sucede es que perdi todos los registros de asistencia de esa fecha.. y lo que quiero es asignarle una hora de entrada y salida a todos los empleados (para que no me quede ese dia en blanco), xq son muchos registros de empleado y es tedioso hacer el insert por cada ci.

estoy revisando el manual de mysql para seber algo del procedure xq no he trabajado con eso antes y bueno tengo algunos errores de syntax... si tienes un ejemplito por ahi de como trabajarlo te lo agradeceria.... ;D


Título: Re: insert y subconsultas en mysql
Publicado por: ^Tifa^ en 8 Junio 2010, 21:26 pm
A lo mejor esto te puede ayudar.

Tengo 2 tablas (como ejemplo):

Código
  1. mysql> DESCRIBE example;
  2. +--------+----------+------+-----+---------+-------+
  3. | FIELD  | TYPE     | NULL | KEY | DEFAULT | Extra |
  4. +--------+----------+------+-----+---------+-------+
  5. | nombre | CHAR(20) | YES  |     | NULL    |       |
  6. | fecha  | DATE     | YES  |     | NULL    |       |
  7. +--------+----------+------+-----+---------+-------+
  8. 2 ROWS IN SET (0.00 sec)
  9.  
  10. mysql> DESCRIBE ejemplo;
  11. +--------+----------+------+-----+---------+-------+
  12. | FIELD  | TYPE     | NULL | KEY | DEFAULT | Extra |
  13. +--------+----------+------+-----+---------+-------+
  14. | nombre | CHAR(20) | YES  |     | NULL    |       |
  15. | fecha  | DATE     | YES  |     | NULL    |       |
  16. +--------+----------+------+-----+---------+-------+
  17. 2 ROWS IN SET (0.02 sec)
  18.  

Una tiene registros, la otra esta vacia:

Código
  1.  
  2. mysql> SELECT * FROM ejemplo;
  3. +--------+------------+
  4. | nombre | fecha      |
  5. +--------+------------+
  6. | coco   | 0000-00-00 |
  7. | Maria  | 2010-11-23 |
  8. | Juan   | 2005-05-23 |
  9. | Carlos | 2004-05-25 |
  10. | Ana    | 2010-11-23 |
  11. +--------+------------+
  12. 5 ROWS IN SET (0.00 sec)
  13.  
  14. mysql> SELECT * FROM example;
  15. Empty SET (0.00 sec)
  16.  
  17.  

Asi que, como quiero obtener todos los 'nombres' de la tabla ejemplo he introducirlos en la tabla example
no puedo hacer lo que sugeriste al inicio de este post, porque:

1 - Una consulta INSERT unica en la linea de comando, solo sirve para insertar 1 sola fila dentro de una tabla
No es un bucle, no es un loop, es una sola fila dentro de la tabla.

2 - Al utilizar un subquery como hiciste, dentro del unico INSERT en linea de comando, caemos en el mismo problema
dicho subquery te retorna mas de 1 registro (SELECT * FROM... retorna varios registros no uno solo) sin embargo
tu consulta INSERT solo inserta 1 fila de una sola vez.

ENtonces que haces, si tu tienes que captar varios registros y ingresarlo en una tabla pero con una simple consulta
SQL INSERT en linea de comandos no puedes? pues te ayudas en este caso de un procedimiento almacenado, como bien dijiste
dicho procedimiento tiene que tener CURSORES y un bucle repetitivo que vaya captando indice por indice cada registro
y lo vaya insertando en la tabla deseada... entonces, (no soy buena con el limitante PL/SQL de MySQL) pero aqui vamos,
esto te puede servir de ejemplo:

Código
  1.  
  2. mysql> delimiter /
  3.  
  4. mysql> CREATE PROCEDURE proceso()
  5. BEGIN
  6. DECLARE hecho INT DEFAULT 0;
  7. DECLARE a CHAR(20);
  8. DECLARE cursor1 cursor FOR SELECT nombre FROM primaria.ejemplo;
  9. DECLARE continue handler FOR sqlstate '02000' SET hecho = 1;
  10. OPEN cursor1;
  11. repeat
  12. fetch cursor1 INTO a;
  13. IF NOT hecho THEN
  14. INSERT INTO example VALUES(a, '2010-11-23');
  15. END IF;
  16. until hecho END repeat;
  17. close cursor1;
  18. END;
  19. /
  20.  
  21. mysql> delimiter ;
  22.  
  23.  

Hecho el procedimiento anterior.. lo llamas:

Código
  1.  
  2. mysql> CALL proceso();
  3. Query OK, 1 ROW affected (0.01 sec)
  4.  
  5. mysql> SELECT * FROM example;
  6. +--------+------------+
  7. | nombre | fecha      |
  8. +--------+------------+
  9. | coco   | 2010-11-23 |
  10. | Maria  | 2010-11-23 |
  11. | Juan   | 2010-11-23 |
  12. | Carlos | 2010-11-23 |
  13. | Ana    | 2010-11-23 |
  14. +--------+------------+
  15. 5 ROWS IN SET (0.00 sec)
  16.  
  17.  

Salu2.