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 Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-11-2005
Abel Garcia Abel Garcia is offline
Miembro
 
Registrado: nov 2004
Posts: 45
Poder: 0
Abel Garcia Va por buen camino
Lightbulb Borrar n Registros de una Tabla

Hola, Tengo una duda que en primera instancia pareseria sencilla pero no he encontrado como hacerlo, la idea seria borrar los primeros n registros de una tabla esto usando Firebird 1.5 , el problema es que me encontre un parrafo en el documento Firebird 1.5 Relese notes donde afirma que la siguiente posible intruccion que podria llegar ha hacer esto tendria el siguiente problema:

Two Gotchas with SELECT FIRST
1. This
delete from TAB1 where PK1 in (select first 10 PK1 from TAB1);
will delete all of the rows in the table. Ouch! the sub-select is evaluating each 10 candidate rows for
deletion, deleting them, slipping forward 10 more...ad infinitum, until there are no rows left.
y si efectivamente si ejecutas la instruccion no solo borra los 10 primero como pudieras esperar, sin no que borra todos los registros:
Alguien mas Tiene un idea de como hacer esto ?

Muchas gracias por su ayuda
Responder Con Cita
  #2  
Antiguo 08-11-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
En un query haces el select de esos primeros 10 registros y luego los recorres del primero al último borrándolo.
Responder Con Cita
  #3  
Antiguo 08-11-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos
Cita:
Empezado por Abel Garcia
Two Gotchas with SELECT FIRST
1. This
delete from TAB1 where PK1 in (select first 10 PK1 from TAB1);
[font=Trebuchet MS][size=2]
will delete all of the rows in the table. Ouch! the sub-select is evaluating each 10 candidate rows for
deletion, deleting them, slipping forward 10 more...ad infinitum, until there are no rows left.
[le
CHANFLEE!! No sabia. Nunca se me habia presentado el caso de borrar los 1ro tantos de un registro.
Seria interesante que alguien nos dijera como se podria hacer en sentencias.
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #4  
Antiguo 08-11-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Cita:
Empezado por Casimiro Notevi
En un query haces el select de esos primeros 10 registros y luego los recorres del primero al último borrándolo.
Esto es como los conocidos cursores en otros motores, creo que aquí se hace con la instrucción FOR..
__________________
No todo es como parece ser...
Responder Con Cita
  #5  
Antiguo 08-11-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Desde delphi podrías hacer algo así,:

Código SQL [-]
 DMdoc.QRlineas.Close;
 DMdoc.QRlineas.SelectSQL.Text := 'select first 10 from tbLineas';
 DMdoc.QRlineas.Open
 while not DMdoc.QRlineas.Eof do
     DMdoc.QRlineas.Delete;
Responder Con Cita
  #6  
Antiguo 08-11-2005
Abel Garcia Abel Garcia is offline
Miembro
 
Registrado: nov 2004
Posts: 45
Poder: 0
Abel Garcia Va por buen camino
Cita:
Empezado por Casimiro Notevi
Desde delphi podrías hacer algo así,:

Código SQL [-]
 DMdoc.QRlineas.Close;
 DMdoc.QRlineas.SelectSQL.Text := 'select first 10 from tbLineas';
 DMdoc.QRlineas.Open
 while not DMdoc.QRlineas.Eof do
     DMdoc.QRlineas.Delete;
Ok si Casimiro Notevi, esa seria una forma pero la idea seria sin usar por decir delphi, sino atravez de una sentencia SQL, obviamenete tambien seria sin usar un procedimiento en la base de datos, bueno si es que es posible hacerlo ?
Responder Con Cita
  #7  
Antiguo 08-11-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Abel Garcia
Ok si Casimiro Notevi, esa seria una forma pero la idea seria sin usar por decir delphi, sino atravez de una sentencia SQL, obviamenete tambien seria sin usar un procedimiento en la base de datos, bueno si es que es posible hacerlo ?
Y si no es desde delphi, ni desde un procedimiento o trigger, entonces cómo quiéres hacerlo?, en alguno de los dos sitios tendrás que poner la sentencia
Responder Con Cita
  #8  
Antiguo 08-11-2005
Abel Garcia Abel Garcia is offline
Miembro
 
Registrado: nov 2004
Posts: 45
Poder: 0
Abel Garcia Va por buen camino
Cita:
Empezado por Casimiro Notevi
Y si no es desde delphi, ni desde un procedimiento o trigger, entonces cómo quiéres hacerlo?, en alguno de los dos sitios tendrás que poner la sentencia
Si ok, bueno segun mi idea era hacerlo con algo sencillo como una sentencia SQL
como la del inicio de este hilo:

delete from TAB1 where PK1 in (select first 10 PK1 from TAB1);

bueno si es que es posible ?
Responder Con Cita
  #9  
Antiguo 08-11-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por Casimiro Notevi
Y si no es desde delphi, ni desde un procedimiento o trigger, entonces cómo quiéres hacerlo?, en alguno de los dos sitios tendrás que poner la sentencia
que tal en la "línea de comandos" de isql, bien en la consola de windows o linux?

Tal como lo veo, no será posible... ¿no es esto acaso un fallo?. Firebird debiera procesar primero el subquery, almacenar el resultado en algún lugar (tabla temporal, memoria, etc) y luego hacer el borrado de las líneas coincidentes?

Desconocía como trabaja el motor en este caso particular, y confieso que he quedado sorprendido..

sospecho que forzosamente tendrá que haber algo.... no puede hacerse con una sola sentencia SQL. Por ejemplo, creando un procedimiento almacenado, si que sería posible conseguirlo.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 08-11-2005
Avatar de vtdeleon
vtdeleon vtdeleon is offline
Miembro
 
Registrado: abr 2004
Ubicación: RD & USA
Posts: 3.236
Poder: 24
vtdeleon Va por buen camino
Saludos
Cita:
Empezado por jachguate
Tal como lo veo, no será posible... ¿no es esto acaso un fallo?.
Pienso* que si debe ser.
Cita:
Empezado por jachguate
Firebird debiera procesar primero el subquery, almacenar el resultado en algún lugar (tabla temporal, memoria, etc) y luego hacer el borrado de las líneas coincidentes?
Eso pense*.
Cita:
Empezado por jachguate
Desconocía como trabaja el motor en este caso particular, y confieso que he quedado sorprendido..
Hice la prueba y me he quedado como tú

Quien tenga Oracle, MSSQL y MYSQL, que prueben a ver. Me gustaria saber el resultado (con una base de datos de prueba, claro está).

*Mucho pensamientos
__________________
Van Troi De León
(Not) Guía, Code vB:=Delphi-SQL, ¿Cómo?
Viajar en el tiempo no es teóricamente posible, pues si lo fuera, ya estarían aqui contándonos al respecto!
Responder Con Cita
  #11  
Antiguo 08-11-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por vtdeleon
Quien tenga Oracle, MSSQL y MYSQL, que prueben a ver.
Pues en MySql 4.x no se puede pues el equivalente a first (limit) no puede usarse un subconsultas. Sin embargo, en este caso, es inecesaria la subconsulta ya que basta hacer:

Código SQL [-]
delete from tabla limit 10

// Saludos
Responder Con Cita
  #12  
Antiguo 08-11-2005
Abel Garcia Abel Garcia is offline
Miembro
 
Registrado: nov 2004
Posts: 45
Poder: 0
Abel Garcia Va por buen camino
Bueno pensandolo muy bien si es que existe una soluccion aun cuando sea con un procedimiento almacenado en la base de datos alguien tiene una idea, supongo que se tendria que Usar una Tabla temporal o algo asi alguien sabe como ?
Responder Con Cita
  #13  
Antiguo 08-11-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Cita:
Empezado por vtdeleon
Quien tenga Oracle, MSSQL y MYSQL, que prueben a ver. Me gustaria saber el resultado (con una base de datos de prueba, claro está).
En SQL Server funciona perfecto

Código SQL [-]
 
 delete from cliente 
 where nombre in (select TOP 2 nombre from cliente)

Hasta Luego -
__________________
No todo es como parece ser...
Responder Con Cita
  #14  
Antiguo 08-11-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Cita:
Empezado por Abel Garcia
Bueno pensandolo muy bien si es que existe una soluccion aun cuando sea con un procedimiento almacenado en la base de datos alguien tiene una idea
esto podría servirte

Debes hacer algo así.

Código SQL [-]
 For select firts 10 from tabla into :variable
 begin
  ....instrucciones sql
   delete from tabla where campo = variable;
 end;

En el enlace que te deje sale más explicativo el uso de procedimientos almacenados y la instrucción For..Do.

Hasta Luego -
__________________
No todo es como parece ser...
Responder Con Cita
  #15  
Antiguo 08-11-2005
Abel Garcia Abel Garcia is offline
Miembro
 
Registrado: nov 2004
Posts: 45
Poder: 0
Abel Garcia Va por buen camino
Me temo que no podria ser por este metodo, lo que pasa que este metodo requiere que
por lo menos uno de los campos en la tabla sea del tipo unico algo asi como un consecutivo unico para cada registro por que si esto no fuera asi, entonces cuando se ejecute la sentencia delete borraria campos de mas. Ademas no se que pasa si parseas una tabla de los primeros 10 en donde ademas estas borrando registros de esta tabla Me parese raro . Habria que probar No Cren....?
Responder Con Cita
  #16  
Antiguo 08-11-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Tienes razón, debe haber un modo....
__________________
No todo es como parece ser...
Responder Con Cita
  #17  
Antiguo 09-11-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por jachguate
que tal en la "línea de comandos" de isql, bien en la consola de windows o linux?
Ya hombre, se suponía que era para usar desde dentro de un programa.

Cita:
Empezado por jachguate
Tal como lo veo, no será posible... ¿no es esto acaso un fallo?. Firebird debiera procesar primero el subquery, almacenar el resultado en algún lugar (tabla temporal, memoria, etc) y luego hacer el borrado de las líneas coincidentes?
Desconocía como trabaja el motor en este caso particular, y confieso que he quedado sorprendido..
Acabo de hacer algo así:
Código SQL [-]
   delete from
tblineasdocumentos
where codigocabecera in
  (select first 10 codigocabecera
   from tblineasdocumentos)
y me he quedado sin datos

Cita:
Empezado por jachguate
sospecho que forzosamente tendrá que haber algo.... no puede hacerse con una sola sentencia SQL.
Tiene que haber algo

Cita:
Empezado por jachguate
Por ejemplo, creando un procedimiento almacenado, si que sería posible conseguirlo.
Claro, así sí.
Responder Con Cita
  #18  
Antiguo 09-11-2005
Avatar de lucasarts_18
lucasarts_18 lucasarts_18 is offline
Miembro
 
Registrado: mar 2005
Ubicación: Villa Alemana,Chile
Posts: 1.087
Poder: 21
lucasarts_18 Va por buen camino
Cita:
Empezado por Casimiro Notevi
Tiene que haber algo
Yo creo que todos estamos esperando ansiosamente como se haría desde un SP, o no ?

Saludos..
__________________
No todo es como parece ser...
Responder Con Cita
  #19  
Antiguo 09-11-2005
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
en un procedimiento sería algo así, como ya ha escrito antes Lucasarts_18:

Código SQL [-]
   CREATE PROCEDURE BorrarPrimerosRegistros (CUANTOSBORRAR INTEGER)
   AS
   DECLARE VARIABLE COD INTEGER;
   begin
       for select first( :cuantosborrar ) codigo
           from tbclientes
           into :cod
       do
          delete from tbclientes where codigo= :COD;
   end

Última edición por Casimiro Notevi fecha: 09-11-2005 a las 14:19:45.
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 00:12:02.


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