varios una tablas tabla registros registro modificar inner eliminar ejemplos delete consultas con complejas borrar sql

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.