Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-04-2017
SmartZooft SmartZooft is offline
Miembro
 
Registrado: dic 2016
Posts: 22
Poder: 0
SmartZooft Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 05-04-2017
orodriguezca orodriguezca is offline
Miembro
 
Registrado: ene 2009
Posts: 221
Poder: 16
orodriguezca Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 05-04-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 05-04-2017
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Cita:
Empezado por SmartZooft Ver Mensaje
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')
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #5  
Antiguo 06-04-2017
SmartZooft SmartZooft is offline
Miembro
 
Registrado: dic 2016
Posts: 22
Poder: 0
SmartZooft Va por buen camino
Cita:
Empezado por RONPABLO Ver Mensaje
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!
Responder Con Cita
  #6  
Antiguo 08-04-2017
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Cita:
Empezado por SmartZooft Ver Mensaje
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.
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #7  
Antiguo 08-04-2017
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.021
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por RONPABLO Ver Mensaje
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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Insertar sentencia SQL despues de Insert,update o delete vivamotos Firebird e Interbase 10 02-08-2011 19:24:30
Ayuda con DELETE IgnacioHaro SQL 1 02-03-2009 21:24:14
ayuda con un delete sargento elias Conexión con bases de datos 2 21-04-2008 13:11:00
Como crear una sentencia SQL (Insert, update y delete) sitrico Conexión con bases de datos 1 14-10-2004 01:02:42
Error en sentencia delete febito Oracle 2 25-06-2004 16:23:50


La franja horaria es GMT +2. Ahora son las 00:58:38.


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
Copyright 1996-2007 Club Delphi