sql - tablas - Eliminar todas las filas en una tabla basada en otra tabla
eliminar varios registros sql (14)
¡No puedo recordar esta consulta alguna vez!
Quiero eliminar todas las filas de la tabla 1, cuyos ID son los mismos que en la Tabla2.
Asi que:
DELETE table1 t1
WHERE t1.ID = t2.ID
Sé que puedo hacer un WHERE ID IN (SELECCIONE ID FROM table2) pero quiero hacer esta consulta usando un JOIN si es posible.
A menudo hago cosas como el siguiente ejemplo inventado. (Este ejemplo es de Informix SE ejecutándose en Linux).
El objetivo de este ejemplo es eliminar todos los registros de transacciones de exención / reducción de bienes raíces, ya que la aplicación de reducción tiene un error, en función de la información de la tabla real_estate.
En este caso, last_update != null
significa que la cuenta no está cerrada, y res_exempt != ''p''
significa que las cuentas no son propiedad personal (equipo / mobiliario comercial).
delete from trans
where yr = ''16''
and tran_date = ''01/22/2016''
and acct_type = ''r''
and tran_type = ''a''
and bill_no in
(select acct_no from real_estate where last_update is not null
and res_exempt != ''p'');
Me gusta este método, porque el criterio de filtrado, al menos para mí, es más fácil de leer al crear la consulta, y comprender muchos meses a partir de ahora cuando lo miro y me pregunto qué estaba pensando.
Creo que podrías obtener un poco más de rendimiento si probaras esto
DELETE FROM Table1
WHERE EXISTS (
SELECT 1
FROM Table2
WHERE Table1.ID = Table2.ID
)
Dado que el OP no solicita una base de datos específica, utilice mejor una declaración que cumpla con los estándares. Solo MERGE
está en el estándar SQL para eliminar (o actualizar) filas al unir algo en la tabla de destino.
merge table1 t1
using (
select t2.ID
from table2 t2
) as d
on t1.ID = d.ID
when matched then delete;
MERGE
tiene una semántica más estricta, protegiendo de algunos casos de error que pueden pasar desapercibidos con DELETE ... FROM
. Impone la ''singularidad'' de la coincidencia: si muchas filas en el origen (la instrucción dentro de using
) coinciden con la misma fila en el destino, la fusión debe cancelarse y el motor SQL debe generar un error.
Encontré este link útil
Copiado desde allí
A menudo, uno quiere eliminar algunos registros de una tabla según los criterios de otra tabla. ¿Cómo se elimina de una de esas tablas sin eliminar los registros en ambas tablas?
DELETE DeletingFromTable
FROM DeletingFromTable INNER JOIN CriteriaTable
ON DeletingFromTable.field_id = CriteriaTable.id
WHERE CriteriaTable.criteria = "value";
La clave es que especifique el nombre de la tabla para eliminar como SELECCIONAR. Entonces, JOIN y WHERE seleccionan y limitan, mientras que ELIMINAR elimina. Sin embargo, no estás limitado a una sola mesa. Si tiene una relación de varios a varios (por ejemplo, Revistas y suscriptores, unidos por una Suscripción) y está eliminando un Suscriptor, también debe eliminar todos los registros potenciales del modelo de unión.
DELETE subscribers, subscriptions
FROM subscribers INNER JOIN subscriptions
ON subscribers.id = subscriptions.subscriber_id
INNER JOIN magazines
ON subscriptions.magazine_id = magazines.id
WHERE subscribers.name=''Wes'';
La eliminación de registros con una unión también se podía hacer con un JOIN IZQUIERDO y un WHERE para ver si la tabla unida era NULL, de modo que pudiera eliminar registros en una tabla que no tenía una coincidencia (como preparación para agregar una relación). ) Ejemplo de publicación por venir.
Esto eliminará todas las filas en la Table1
que coincidan con los criterios:
DELETE Table1
FROM Table2
WHERE Table1.JoinColumn = Table2.JoinColumn And Table1.SomeStuff = ''SomeStuff''
Esto es viejo, lo sé, pero solo un puntero para cualquiera que use este culo como referencia. Acabo de probar esto y si está utilizando Oracle, JOIN no funciona en las declaraciones DELETE. Usted recibe el siguiente mensaje:
ORA-00933: el comando SQL no finalizó correctamente.
La implementación de PostgreSQL sería:
DELETE FROM t1
USING t2
WHERE t1.id = t2.id;
Mientras que OP no quiere usar una declaración ''in'', en respuesta a Ankur Gupta, esta fue la forma más fácil que encontré para eliminar los registros en una tabla que no existía en otra tabla, en una relación uno a muchos :
DELETE
FROM Table1 as t1
WHERE ID_Number NOT IN
(SELECT ID_Number FROM Table2 as t2)
Trabajó como un encanto en Access 2016, para mí.
No hay solución en ANSI SQL para usar uniones en las eliminaciones, AFAIK.
DELETE FROM Table1
WHERE Table1.id IN (SELECT Table2.id FROM Table2)
Editar más tarde
Otra solución (a veces más rápido):
DELETE FROM Table1
WHERE EXISTS( SELECT 1 FROM Table2 Where Table1.id = Table2.id)
Para eliminar registros de tabla basados en otra tabla
Delete From Table1 a,Table2 b where a.id=b.id
Or
DELETE FROM Table1
WHERE Table1.id IN (SELECT Table2.id FROM Table2)
Or
DELETE Table1
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID;
Prueba esto:
DELETE Table1
FROM Table1 t1, Table2 t2
WHERE t1.ID = t2.ID;
o
DELETE Table1
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID;
Hacer referencia a MSDN T-SQL DELETE (Ejemplo D):
DELETE FROM Table1
FROM Tabel1 t1
INNER JOIN Table2 t2 on t1.ID = t2.ID
DELETE Table1
FROM Table1
INNER JOIN Table2 ON Table1.ID = Table2.ID
DELETE t1
FROM Table1 t1
JOIN Table2 t2 ON t1.ID = t2.ID;
Siempre uso el alias en la declaración de eliminación, ya que evita el accidente
DELETE Table1
causado al no poder resaltar toda la consulta antes de ejecutarla.