¿Cómo podría hacerse una sentencia de este tipo en Firebird?
DELETE empleados FROM empleados INNER JOIN empleadosbaja ON empleados.clave = empleadosbaja.clave
Posted 16 February 2015 - 03:53 PM
DELETE empleados FROM empleados INNER JOIN empleadosbaja ON empleados.clave = empleadosbaja.clave
Posted 16 February 2015 - 04:48 PM
on delete cascade
Posted 16 February 2015 - 05:12 PM
delete from empleados where id_empleado in select id_empleado from empleadosbaja
Posted 16 February 2015 - 07:51 PM
Posted 17 February 2015 - 03:57 AM
delete from empleados where id_empleado in ( select b.id_empleado from empleadosbaja b where b.pais=18 and b.fechaalta<'12.01.2014' )
delete from empleados where id_empleado in (select id_empleado from empleadosbaja) and pais in (select pais from paises where activo=1)
Posted 17 February 2015 - 10:38 AM
O si son varios campos los que tienen que cumplir diferentes consultas:
delphi
delete from empleados where id_empleado in (select id_empleado from empleadosbaja) and pais in (select pais from paises where activo=1)
Posted 17 February 2015 - 06:49 PM
delete from empleados where id_empleado || id_ciudad in (select distinct id_empleado || id_ciudad from empleadosbaja)
Posted 18 February 2015 - 08:42 AM
en ciertas oportunidades donde tengo varios campos en la llave primaria, lo que hago es concatenar esto en un texto y realizo la comparación.
delphi
delete from empleados where id_empleado || id_ciudad in (select distinct id_empleado || id_ciudad from empleadosbaja)
Algo así, hasta ahora me ha funcionado perfectamente, claro que esto lo trabajo en postgres, pero debe funcionar similarmente en otras bd.
Saludos.
Posted 18 February 2015 - 01:21 PM
Posted 18 February 2015 - 01:53 PM
Amigo Poliburro
En eso tienes toda la razón, son cuidados que hay que tener, por eso no la había propuesto antes en este foro, pero puede sacar de apuros en algunos casos.
Saludos.
Posted 19 February 2015 - 08:20 AM
en ciertas oportunidades donde tengo varios campos en la llave primaria, lo que hago es concatenar esto en un texto y realizo la comparación.
delphi
delete from empleados where id_empleado || id_ciudad in (select distinct id_empleado || id_ciudad from empleadosbaja)
Algo así, hasta ahora me ha funcionado perfectamente, claro que esto lo trabajo en postgres, pero debe funcionar similarmente en otras bd.
Saludos.
delete from empleados where id_empleado || '-' || id_ciudad in (select distinct id_empleado || '-' || id_ciudad from empleadosbaja)
Posted 19 February 2015 - 08:26 AM
en ciertas oportunidades donde tengo varios campos en la llave primaria, lo que hago es concatenar esto en un texto y realizo la comparación.
delphi
delete from empleados where id_empleado || id_ciudad in (select distinct id_empleado || id_ciudad from empleadosbaja)
Algo así, hasta ahora me ha funcionado perfectamente, claro que esto lo trabajo en postgres, pero debe funcionar similarmente en otras bd.
Saludos.
Es una solución bastante creativa amigo mio pero no es la más óptima. Me explico:
Cuando realizas búsquedas en campos llave estás aprovechando la optimización del motor al trabajar con campos indexados. Pero cuando concatenas se pierde la ventaja del índice y el motor de base de datos debe recorrer fila por fila comparando los valores para encontrar el rango de filas coincidentes, eso en unos pocos cientos de filas es aceptable pero no cuando trabajas con miles o millones.
Posted 19 February 2015 - 08:56 AM
Ahora todo depende de que el motor de Firebird sea suficientemente inteligente para detectar al lanzar tu consulta que puedes utilizar este índice (la verdad es que nunca lo he probado, pero si existe es porque lo debe detectar).
NOTA: Aplicando la corrección que sugiero en el mensaje anterior, el índice quedaría :
CREATE INDEX IDX_BUSQUEDA ON EMPLEADOS COMPUTED BY (ID_EMPLEADO || '-' || ID_CIUDAD);
Saludos.
Posted 20 February 2015 - 05:06 AM
Saludos.
Tal vez puedes forzar que use un plan determinado.
Fenomenal amigo... Me parece que vale la pena hacer una prueba sobre esta situación. Voy a aprovechar la info y sacaré las estadísticas de cada consulta para comparar resultados. ¿Qué les parece?
Posted 25 February 2015 - 10:17 PM
DELETE FROM empleados E WHERE EXISTS ( SELECT DISTINCT id_empleado FROM empleadosbaja Filtro WHERE E.Id_Empleado = Filtro.Id_Empleado AND Filtro.Pais = Pais)
Posted 26 February 2015 - 07:30 AM
Posted 26 February 2015 - 04:42 PM
DELETE FROM empleados E WHERE id_empleado IN ( SELECT id_empleado FROM empleadosbaja Filtro WHERE E.Id_Empleado = Filtro.Id_Empleado AND Filtro.Pais = Pais )
Posted 26 February 2015 - 04:56 PM