Discussion:
Consulta de eliminación con dos tablas
(demasiado antiguo para responder)
Tony
2009-12-16 20:54:02 UTC
Permalink
Hola a todos:

Tengo una consulta de eliminación creada con dos tablas relacionadas entre
sí por el campo "COD"... En ninguna de las dos tablas tengo un campo único,
puesto que los registros pueden estar duplicados en una y en otra, por lo que
dicha relación es de varios a varios...

Lo que pretendo es eliminar los registros de la tabla 1 que tengan registros
en la tabla 2... Pero cuando ejecuto la consulta me dice: "No se puede
eliminar nada en las tablas especificadas" a pesar de que he puesto en
"donde" que el código de la tabla 1 coincida con el código de la tabla 2...

¿¿Cómo puedo solucionarlo??...

Gracias por anticipado...
José Mª Fueyo
2009-12-17 11:49:25 UTC
Permalink
Hola
No nos comentas que versión de Access utilizas
¿Tienes establecida una relación entre esas tablas? y de ser así
¿tienes establecida integridad referencial, con eliminado en cascada?

Salu2
---
José Mª Fueyo
[MS MVP Access]
José Mª Fueyo
2009-12-17 12:32:35 UTC
Permalink
Hola
Prueba a usar la sintaxis IN. Dos tablas que se relacionan por el
campo COD, y quiero borrar los coincidentes en la Tabla1 que coincide
con la Tabla2

DELETE Tabla1.*, Tabla1.COD
FROM Tabla1
WHERE (((Tabla1.COD) In (select distinct COD from Tabla2)));

Salu2
---
José Mª Fueyo
[MS MVP Access]
Tony
2009-12-17 15:42:02 UTC
Permalink
Las dos tablas las tengo relacionadas en la propia consulta de eliminación...
Y mi versión de Access es el 2000...

Probaré lo que me dices, pero de la Tabla1 quiero borrar los que coinciden
en base a 3 campos coincidentes que tienen las dos tablas... Es decir, que
según lo tenía puesto en la consulta en el "donde" ponía los campos de la
tabla2 para que coincidiesen con los de la tabla1... Los registros que tenía
que eliminar me aparecían correctamente pero luego me daba el error que he
comentado...

Probaré con lo que me has dicho, José María... Gracias...
Post by José Mª Fueyo
Hola
Prueba a usar la sintaxis IN. Dos tablas que se relacionan por el
campo COD, y quiero borrar los coincidentes en la Tabla1 que coincide
con la Tabla2
DELETE Tabla1.*, Tabla1.COD
FROM Tabla1
WHERE (((Tabla1.COD) In (select distinct COD from Tabla2)));
Salu2
---
José Mª Fueyo
[MS MVP Access]
.
Tony
2009-12-22 16:09:01 UTC
Permalink
Ya he probado lo que me poníais y sí me da el resultado esperado...

Pero ahora tengo otro problema con este mismo asunto... He probado a hacer
lo mismo con otra consulta de este tipo en el que están relacionadas una
tabla con una consulta... En este caso la tabla en cuestión tiene más de un
millón de registros, por lo que al realizar la instrucción SQL el tiempo de
espera se demora en muchos minutos...

Mi pregunta es si puedo eliminar registros de una consulta, llamemosla
"ConsultaA" por medio de código... Es decir, sobre la consulta que tengo
montada (unión de la tabla y la consulta) que por medio de código fuera
leyendo los registros de dicha consulta y fuera eliminando los registros de
la tabla...

¿¿Es posible y más rápido por código??... ¿¿Cómo sería el código??...

Gracias de nuevo...
Post by Tony
Las dos tablas las tengo relacionadas en la propia consulta de eliminación...
Y mi versión de Access es el 2000...
Probaré lo que me dices, pero de la Tabla1 quiero borrar los que coinciden
en base a 3 campos coincidentes que tienen las dos tablas... Es decir, que
según lo tenía puesto en la consulta en el "donde" ponía los campos de la
tabla2 para que coincidiesen con los de la tabla1... Los registros que tenía
que eliminar me aparecían correctamente pero luego me daba el error que he
comentado...
Probaré con lo que me has dicho, José María... Gracias...
Post by José Mª Fueyo
Hola
Prueba a usar la sintaxis IN. Dos tablas que se relacionan por el
campo COD, y quiero borrar los coincidentes en la Tabla1 que coincide
con la Tabla2
DELETE Tabla1.*, Tabla1.COD
FROM Tabla1
WHERE (((Tabla1.COD) In (select distinct COD from Tabla2)));
Salu2
---
José Mª Fueyo
[MS MVP Access]
.
Patxi Sanz
2009-12-23 16:00:44 UTC
Permalink
Por ser, es posible. Pero recorrer un millón de registros va a demorar, ya
sea mediante consultas o mediante código.

Si quieres usar código, tendrás que usar un objeto Recordset que use la
consulta, recorrer sus registros, y para cada registro, ejecutar una
consulta de eliminación sobre la tabla o abrir otro objeto Recordset sobre
la tabla y eliminar todos los registros relacionados.

Ejemplos sobre usar objetos Recordset tienes en la ayuda de VBA y en este
mismo grupo.

Pero lo dicho: te va a costar más o menos el mismo tiempo si usas código que
si usas una consulta. Eso sí, verifica que tienes bien indexada la tabla
donde quieres eliminar los registros, y las tablas que usas en la consulta.
Unos buenos índices harán que se ejecute algo más rápida la consulta de
eliminación.
--
Un saludo,


Patxi Sanz
Tudela (NA)
Tony
2009-12-24 17:02:01 UTC
Permalink
Gracias Patxi por la respuesta...

¿¿Cuando te refieres a unos buenos índices quieres decir, por ejemplo un ID
autonumérico??...

¿¿Algún consejo para poder realizar la operación que quiero en menos
tiempo??...

Gracias de nuevo...
Post by Patxi Sanz
Por ser, es posible. Pero recorrer un millón de registros va a demorar, ya
sea mediante consultas o mediante código.
Si quieres usar código, tendrás que usar un objeto Recordset que use la
consulta, recorrer sus registros, y para cada registro, ejecutar una
consulta de eliminación sobre la tabla o abrir otro objeto Recordset sobre
la tabla y eliminar todos los registros relacionados.
Ejemplos sobre usar objetos Recordset tienes en la ayuda de VBA y en este
mismo grupo.
Pero lo dicho: te va a costar más o menos el mismo tiempo si usas código que
si usas una consulta. Eso sí, verifica que tienes bien indexada la tabla
donde quieres eliminar los registros, y las tablas que usas en la consulta.
Unos buenos índices harán que se ejecute algo más rápida la consulta de
eliminación.
--
Un saludo,
Patxi Sanz
Tudela (NA)
.
Patxi Sanz
2009-12-26 10:25:55 UTC
Permalink
Una cosa es un índice, y otra un campo de tipo autonumérico:

- http://office.microsoft.com/es-es/access/HA102103473082.aspx
- http://www.aulaclic.es/access2002/a_5_1_3.htm

El consejo es el mismo: los campos con los que relaciones la tabla y la
consulta, mejor si están indexados. Y un millón de registros va a demorar en
su ejecución.
--
Un saludo,


Patxi Sanz
Tudela (NA)
Francisco Jose Hidalgo
2023-10-17 16:58:19 UTC
Permalink
Post by José Mª Fueyo
Hola
Prueba a usar la sintaxis IN. Dos tablas que se relacionan por el
campo COD, y quiero borrar los coincidentes en la Tabla1 que coincide
con la Tabla2
DELETE Tabla1.*, Tabla1.COD
FROM Tabla1
WHERE (((Tabla1.COD) In (select distinct COD from Tabla2)));
Salu2
---
José Mª Fueyo
[MS MVP Access]
Buenas.
Aunque sea de un foro del 2009 me ha venido muy bien esta síntaxis, en el 2023, para crear una consulta de eliminación de dos tablas relacionadas. No ha habido forma de hacerlo con el asistente. Gracias
Loading...