sql - update - insert into access vba
¿Cómo eliminar en MS Access cuando se utiliza JOIN? (3)
Un problema a tener en cuenta: ¡Esto NO funciona con alias de tabla / consulta!
DELETE a.*
from tblA as A
where exists (select 1 from tblB as B where a.id=b.id)
Elimina TODOS los registros en tblA! Lo intenté usando alias para tblA y tblB por separado: el mismo resultado (Access 2010).
Ocurre con SELECT también (que a menudo uso antes de eliminar) ...
Estoy intentando utilizar la cláusula DELETE
en MS Access y tengo un problema cuando también uso la cláusula JOIN
. He notado que esto se puede lograr usando la palabra clave DISTINCTROW
.
Por ejemplo, la siguiente instrucción SQL no permite la eliminación:
DELETE Table1.*
FROM Table1 INNER JOIN Table2 ON Table1.Name=Table2.Name;
Sin embargo, esta declaración hace:
DELETE DISTINCTROW Table1.*
FROM Table1 INNER JOIN Table2 ON Table1.Name=Table2.Name;
- ¿Por qué el
DELETE
funciona cuando se usa la palabra claveDISTINCTROW
? - Más específicamente, ¿qué está pasando en el motor JET para requerir esto?
DELETE a.*
FROM tblA AS A
WHERE EXISTS (SELECT 1 FROM tblB AS B WHERE a.id=b.id)
prueba esto
DELETE tblA
FROM tblB
WHERE EXISTS (SELECT * FROM tblA AS A,tblB AS B WHERE A.id=B.id)
Delete Table1.*
From Table1
Where Exists( Select 1 From Table2 Where Table2.Name = Table1.Name ) = True
Para ampliar mi respuesta, la especificación oficial de SQL no permite el uso de uniones en consultas de acción específicamente porque puede crear resultados ambiguos. Por lo tanto, es mejor (y Access es mucho más feliz) si puede evitar el uso de uniones en las consultas de acción como he aquí. La razón por la que Access quiere DISTINCTROW es que es probable que la combinación entre las dos tablas cree duplicados de filas de Table1 (es decir, hay múltiples filas relacionadas en Table2) y, por lo tanto, Access se confunde. También descubrí que si intentas utilizar una combinación y una clave principal no existe, Access se bloqueará. En general, es mejor evitar una unión en una consulta de acción si puede.