Hola poshi

Quiero solucionar un problema de optimización de una consulta en una bd en interbase. La optimización que creo conveniente, es redundar un atributo, para que en dicha consulta, no pierda el tiempo en hacer el join. Entonces, ya he añadido dicho atributo a la tabla, pero ahora hay que meterle los valores adecuados y coherentes, dado que en esta tabla tendría toda la información ya insertada, y los valores de este nuevo atributo a null. ¿Me podría decir como meto los valores correctos en este atributo?. Probablemente con una inserción con consulta, pero no se utilizarla bien. Por que creo que inserta al final de la tabla, y esto no me soluciona nada.
Gracias por su atención y espero su respuesta

1 respuesta

Respuesta
1
Lo de redundar un atributo no me parece una buena idea en general, pero hay algunos casos en que vale la pena por la velocidad obtenida aun a costa de complicar el mantenimiento.
Una inserción con consulta desde luego no es la forma, porque significa que estas añadiendo nuevos registros a la tabla, y no es lo que deseas hacer.
Lo que debes hacer es un update con consulta (si es que interbase lo permite, nunca he trabajado con el). Solo tendrías que hacer un update por cada fila con los criterios necesarios para que se ponga el valor correcto. Quizá tengas que tocar algo de Procedure Stored Modules para hacer el bucle.
Pero quizá una forma más sencilla sea:
-Hacer la select con todos los datos y con la join que hacías hasta ahora, de tal forma que te devuelva todos los registros de la tabla más lo que quieres añadir.
-Guardar el resultado en una tabla temporal
-Sustituir una tabla por otra (borrando la primaria y cambiándole el nombre a la temporal teniendo cuidado con las claves foráneas, por ejemplo).
Si tienes problemas por las FKs, el método del update me parece más adecuado.
En la select tienes que poner una condición en el where que haga referencia a la clave primaria de la tabla.
Si quieres una consulta algo más concreta, dame el diseño de las tablas, a ver si consigo algo más.
Jordi
Pues si que le voy a facilitar diseño, porque llevo días peleándome con ello, y yo no lo veo. Sera por mi inexperiencia.
create table conexiones(
tel_llamada integer not null,
tel_contesta integer not null,
duracion integer not null,
primary key (tel_llamada,tel_contesta,duracion));
crete table clientes(
nºcliente integer primary key,
nombre char(30),
apellidos char(30));
create table telefonos(
telefono integer primary key,
nºcliente foreing key(clientes),
fecha_contrato date);
/*ya mas adelante,con mucha informacion en las tablas*/
alter table conexiones
add nºcliente foreing key(clientes);
¿¿¿
update conexiones
set nºcliente= (select telefonos.cliente
from telefonos,conexiones
where telefonos.telefono=conexiones.tel_llamada);?????
Pero ese select devuelve muchas tuplas, y necesito un select, si es que se puede, que traspase toda la información en teléfonos.nºcliente a conexiones.nºcliente(en este momento todos a null).
Gracias por su atención.
Prueba con la siguiente consulta:
SELECT t.nºcliente
FROM telefonoc t, telefonos t2, conexiones c
WHERE c.tel_llamada=t.telefono AND c.tel_contesta=t2.telefono;
Por otro lado, Yo pondria tel_llamada y tel_contesta como foreign keys de telefonos, y quitaria duracion de la primary key de conexiones. Quizá encesites algun otro identificador en conexiones para identificar conexiones multiples entre dos telefonos, cosa que ahora no contemplas.
¿Puedo preguntar para que es esta BBDD?

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas