Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   ayuda con sentencia delete anidada (https://www.clubdelphi.com/foros/showthread.php?t=91713)

SmartZooft 05-04-2017 21:26:25

ayuda con sentencia delete anidada
 
Hola a todos, tengo dos tablas: Clientes e Historia. Clientes es papá de historia, lo que quiero es borrar de historia los registros donde el cliente tenga fecha menor al año 2015, lo tengo así...

DELETE FROM HISTORIA
where
ID_CLIENTE IN (SELECT ID_CLIENTE FROM CLIENTES WHERE fecha < '01/01/2015')
AND
ID_HISTORIA IN (SELECT ID_HISTORIA FROM CLIENTES WHERE fecha < '01/01/2015')


pero no sé si funciona porque se queda en el limbo pensando, alguien sabe si se puede optimizar ésta sentencia?

muchas gracias a todos.

orodriguezca 05-04-2017 21:33:29

En principio debería funcionar. Verifica si la consulta realmente selecciona algún registro:

Código SQL [-]
SELECT * FROM HISTORIA
where 
          ID_CLIENTE IN (SELECT ID_CLIENTE FROM CLIENTES WHERE fecha < '01/01/2015')
  AND  ID_HISTORIA IN (SELECT ID_HISTORIA FROM CLIENTES WHERE fecha < '01/01/2015')

Lo otro es dotar a las tablas de los índices adecuados, si no los tiene y si la consulta va a ser repetitiva.

ecfisa 05-04-2017 22:17:45

Hola SmartZooft, bienvenido a Club Delphi :), como acostumbramos con los noveles te aconsejamos leer nuestra guía de estilo.


Por favor, cuando incluyas código en tus mensajes usa etiquetas para darle más legibilidad de este modo:



Saludos :)

RONPABLO 05-04-2017 22:42:56

Cita:

Empezado por SmartZooft (Mensaje 515218)
Hola a todos, tengo dos tablas: Clientes e Historia. Clientes es papá de historia, lo que quiero es borrar de historia los registros donde el cliente tenga fecha menor al año 2015, lo tengo así...

Código SQL [-]
DELETE FROM HISTORIA
where 
ID_CLIENTE IN (SELECT ID_CLIENTE FROM CLIENTES WHERE fecha < '01/01/2015')
AND
ID_HISTORIA IN (SELECT ID_HISTORIA FROM CLIENTES WHERE fecha < '01/01/2015')


pero no sé si funciona porque se queda en el limbo pensando, alguien sabe si se puede optimizar ésta sentencia?

muchas gracias a todos.

Cabe anotar que la clausula "IN" es una clausuala poco recomendable para ser usada en tablas con muchos registros, podrías acomodar mejor la consulta con un exists de la siguiente forma (primero hacer la consulta y si los resultados que se ven son los esperado proceder con el delete)

Código SQL [-]
select * from FROM HISTORIA h
where 
exists (SELECT h1.ID_CLIENTE FROM CLIENTES h1 WHERE h1.ID_CLIENTE = h.ID_CLIENTE and h1.ID_HISTORIA = h.ID_HISTORIA and h1.fecha < '01/01/2015')


Y si funciona bien

Código SQL [-]
delete from FROM HISTORIA h
where 
exists (SELECT h1.ID_CLIENTE FROM CLIENTES h1 WHERE h1.ID_CLIENTE = h.ID_CLIENTE and h1.ID_HISTORIA = h.ID_HISTORIA and h1.fecha < '01/01/2015')

SmartZooft 06-04-2017 04:52:57

Cita:

Empezado por RONPABLO (Mensaje 515221)
Cabe anotar que la clausula "IN" es una clausuala poco recomendable para ser usada en tablas con muchos registros, podrías acomodar mejor la consulta con un exists de la siguiente forma (primero hacer la consulta y si los resultados que se ven son los esperado proceder con el delete)

Código SQL [-]
select * from FROM HISTORIA h
where 
exists (SELECT h1.ID_CLIENTE FROM CLIENTES h1 WHERE h1.ID_CLIENTE = h.ID_CLIENTE and h1.ID_HISTORIA = h.ID_HISTORIA and h1.fecha < '01/01/2015')


Y si funciona bien

Código SQL [-]
delete from FROM HISTORIA h
where 
exists (SELECT h1.ID_CLIENTE FROM CLIENTES h1 WHERE h1.ID_CLIENTE = h.ID_CLIENTE and h1.ID_HISTORIA = h.ID_HISTORIA and h1.fecha < '01/01/2015')

RONPABLO, muchas gracias, esa sentencia es mucho más rápida y efectiva, muchas gracias funciona muy bien!

RONPABLO 07-04-2017 23:38:51

Cita:

Empezado por SmartZooft (Mensaje 515229)
RONPABLO, muchas gracias, esa sentencia es mucho más rápida y efectiva, muchas gracias funciona muy bien!

Con gusto, de la siguiente pagina puedes encontrar otras sugerencias extremadamente útiles al respecto. particularmente me gusta entrar y leer por leer en ella, muchas veces cosas que ya he leído antes pero que no le encontraba un uso inmediato. Para mi club delphi, el FAQ de Firebird y un curso de MsSQL Server llamado Querying (ID 20461D y que se puede buscar en PDF en internet) es de lo que más me ha ayudado a optimizar conexiones lentas por malas practicas.

Casimiro Notevi 08-04-2017 00:00:48

Cita:

Empezado por RONPABLO (Mensaje 515382)
Con gusto, de la siguiente pagina puedes encontrar otras sugerencias extremadamente útiles al respecto. particularmente me gusta entrar y leer por leer en ella, muchas veces cosas que ya he leído antes pero que no le encontraba un uso inmediato. Para mi club delphi, el FAQ de Firebird y un curso de MsSQL Server llamado Querying (ID 20461D y que se puede buscar en PDF en internet) es de lo que más me ha ayudado a optimizar conexiones lentas por malas practicas.

^\||/^\||/^\||/


La franja horaria es GMT +2. Ahora son las 20:44:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi