2009-10-19 20 views
35

¡Parece que nunca puedo recordar esta consulta!Eliminar todas las filas en una tabla basada en otra tabla

Quiero eliminar todas las filas de la tabla 1 cuyos ID son los mismos que en la Tabla2.

Así:

DELETE table1 t1 
WHERE t1.ID = t2.ID 

Yo sé que puedo hacer una DONDE ID IN (SELECT ID DE tabla2) pero yo quiero hacer esta consulta usando un JOIN si es posible.

+0

¿Por qué quiere hacer una unión? – tster

+0

¿Qué piensas hacer con esta pregunta ?: http://stackoverflow.com/questions/1590709/how-to-mark-counted-rows-as-deleted-contind-from-previous-question –

+0

Porque las uniones suelen ser más rápidas . – HLGEM

Respuesta

43
DELETE Table1 
FROM Table1 
INNER JOIN Table2 ON Table1.ID = Table2.ID 
4

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; 
44
DELETE t1 
FROM Table1 t1 
JOIN Table2 t2 ON t1.ID = t2.ID; 

siempre uso el alias en la instrucción de eliminación, ya que impide la accidental

DELETE Table1 

cuando no se resalta toda la consulta antes de ejecutarla.

26

No existe una solución en ANSI SQL para utilizar las uniones en las eliminaciones, AFAIK.

DELETE FROM Table1 
WHERE Table1.id IN (SELECT Table2.id FROM Table2) 

Más tarde editar

otra solución (a veces llevar a cabo más rápido):

DELETE FROM Table1 
WHERE EXISTS(SELECT 1 FROM Table2 Where Table1.id = Table2.id) 
+0

Su pregunta indica al final que quiere usar una unión en lugar de la cláusula IN. –

+0

No creo que haya posibilidad de utilizar combinaciones en este caso ... –

0

referencia a MSDN T-SQL DELETE (Ejemplo D):

DELETE FROM Table1 
FROM Tabel1 t1 
    INNER JOIN Table2 t2 on t1.ID = t2.ID 
3

creo que es posible obtener un poco más de rendimiento si lo intentaste s

DELETE FROM Table1 
WHERE EXISTS (
    SELECT 1 
    FROM Table2 
    WHERE Table1.ID = Table2.ID 
) 
0

Para eliminar registros de la tabla en base a otra mesa

 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; 
0

Esto es viejo lo sé, pero sólo un puntero a cualquier persona que utilice este culo una referencia. Acabo de probar esto y si está utilizando Oracle, JOIN no funciona en las declaraciones DELETE. Aparecerá el siguiente mensaje:

ORA-00933: El comando SQL no finalizó correctamente.

+0

Consulte [esta respuesta a otra pregunta] (http://stackoverflow.com/a/1593280/1178314) para ver un ejemplo de cómo escribir una eliminación con join bajo Oracle. –

2

encontrado este link útil

copiado desde allí

A menudo, se quiere borrar algunos registros de una tabla en función de criterios en otra mesa. ¿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 especificar el nombre de la tabla que desea eliminar de como el SELECT.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'; 

Eliminación de registros con una unión también se podría hacer con un LEFT JOIN y una DONDE para ver si la tabla unida era NULL, por lo que se puede eliminar registros en una tabla que no tenían un partido (como en preparación para agregar una relación). Ejemplo de publicación por venir.

2

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 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, la protección de algunos casos de error que pueden pasar desapercibidas con DELETE ... FROM. Impone 'unicidad' de 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 de SQL debe generar un error.

+0

esto es más limpio que la construcción delete-join – asakura89

0

Si bien OP no desea utilizar una instrucción 'in', en respuesta a Ankur Gupta, esta fue la forma más fácil que encontré para eliminar los registros de una tabla que no existían en otra tabla, en una uno a muchos:

DELETE 
FROM Table1 as t1 
WHERE ID_Number NOT IN 
(SELECT ID_Number FROM Table2 as t2) 

funcionó como un encanto en Access 2016, para mí.

0

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 basado en la información en el inmueble mesa.

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 (equipos comerciales/mobiliario).

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, debido a que los criterios de filtrado - al menos para mí - es más fácil de leer, mientras que la creación de la consulta, y para entender muchos meses a partir de ahora cuando estoy mirando y preguntando qué Yo estaba pensando.

1

Esto eliminará todas las filas de Table1 que coinciden con los criterios:

DELETE Table1 
FROM Table2 
WHERE Table1.JoinColumn = Table2.JoinColumn And Table1.SomeStuff = 'SomeStuff' 
7

aplicación PostgreSQL sería:

DELETE FROM t1 
USING t2 
WHERE t1.id = t2.id; 
Cuestiones relacionadas