¿Cómo podría hacerse una sentencia de este tipo en Firebird?
DELETE empleados FROM empleados INNER JOIN empleadosbaja ON empleados.clave = empleadosbaja.clave
Escrito 16 febrero 2015 - 03:53
DELETE empleados FROM empleados INNER JOIN empleadosbaja ON empleados.clave = empleadosbaja.clave
Escrito 16 febrero 2015 - 04:48
on delete cascade
Escrito 16 febrero 2015 - 05:12
delete from empleados where id_empleado in select id_empleado from empleadosbaja
Escrito 16 febrero 2015 - 07:51
Escrito 17 febrero 2015 - 03:57
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)
Escrito 17 febrero 2015 - 10:38
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)
Escrito 17 febrero 2015 - 06:49
delete from empleados where id_empleado || id_ciudad in (select distinct id_empleado || id_ciudad from empleadosbaja)
Escrito 18 febrero 2015 - 08:42
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.
Escrito 18 febrero 2015 - 01:21
Escrito 18 febrero 2015 - 01:53
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.
Escrito 19 febrero 2015 - 08:20
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)
Escrito 19 febrero 2015 - 08:26
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.
Escrito 19 febrero 2015 - 08:56
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.
Escrito 20 febrero 2015 - 05:06
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?
Escrito 25 febrero 2015 - 10:17
DELETE FROM empleados E WHERE EXISTS ( SELECT DISTINCT id_empleado FROM empleadosbaja Filtro WHERE E.Id_Empleado = Filtro.Id_Empleado AND Filtro.Pais = Pais)
Escrito 26 febrero 2015 - 07:30
Escrito 26 febrero 2015 - 04:42
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 )
Escrito 26 febrero 2015 - 04:56