2010-11-04 13 views
15

¿Es posible eliminar registros basados ​​en una condición de satisfacción con una consulta de unión?SQL Delete basado en la condición en join

Por ejemplo, tengo una tabla de enlace que une 3 registros. La consulta que tengo en este momento borra registros de esta tabla donde uno de los identificadores no es IN() una matriz Php implosionada. Me he dado cuenta de que la consulta solo debería eliminar registros de esta tabla si los ID no existen en la matriz y pertenecen a otra tabla determinada basada en un enlace a otra tabla.

+0

Esto es bastante abstracto, un ejemplo (o lo real) sería genial. De lo contrario, entiendo que puede emplear combinaciones externas izquierdas e IS NULL para el lado derecho para determinar los registros que se eliminarán. – 0xCAFEBABE

+0

No puede hacer ELIMINAR DE X UNIRSE a Y en X.ID = Y.ID, si eso es lo que está preguntando. – dotariel

Respuesta

9

me gusta usar EXISTE cláusulas para esto:

DELETE FROM TableA 
WHERE 
    <<put your array condition here>> 
    AND NOT EXISTS 
    (SELECT 1 FROM TableB Where TableB.ID=TableA.ID) 
+0

+1 Para existe. ¡Cortocircuito! – JNK

4
DELETE FROM TableA 
LEFT OUTER JOIN TableB 
WHERE TableB.Column IS NULL 

Eliminará los registros en la tabla A que no tienen un registro correspondiente en la Tabla B. ¿Es eso lo que buscas?

+0

No estoy seguro acerca de otras bases de datos, pero en MySql definitivamente tendrá que hacer como DELETE TableA FROM TableA LEFT JOIN .. –

0
delete from TableA 
where id in 
(
    select id from TableA 
    except select id from TableB 
) 
Qué

significa "borrar de la Tabla A donde id en la tabla A no, pero en el cuadro b)

De lo contrario una declaración de combinación podría ayudarle (cuando se combina/no emparejado borrar, etc) http://technet.microsoft.com/en-us/library/bb510625.aspx

+0

Esta será una consulta de muy bajo rendimiento ... – JNK

17

para SQL Server, el comando es ligeramente diferente:

DELETE FROM TableA 
FROM TableA LEFT OUTER JOIN TableB ON TableA.Column = TableB.Column 
WHERE TableB.Column IS NULL 

No, eso no es un error tipográfico, sí, se hace necesidad "de la Tabla A" dos veces. Al menos, necesita el segundo FROM (el primero es opcional). A continuación tiene la ventaja de que funciona tanto para SQL Server y MySQL:

DELETE TableA 
FROM TableA LEFT OUTER JOIN TableB ON TableA.Column = TableB.Column 
WHERE TableB.Column IS NULL 
5

que puede utilizar:

BORRADO Basado en una combinación:

DELETE A  
FROM TableA AS A 
    LEFT OUTER JOIN TableB As B ON A.Id = B.TabaleAId 
WHERE B.Column IS NULL 

Eliminar Con subconsulta:

DELETE 
FROM TableA AS A 
Where 
    A.id not in (Select B.TabaleAId From Tab;eB As B) 

o

DELETE FROM TableA 
WHERE Not EXISTS 
    (
    SELECT * 
    FROM TableB As B 
    Where B.TableAId = TableA.Id 
    ) 

elimine usando expresiones de tabla:

With A 
As 
    (
     Select TableA.* 
     FROM TableA AS A 
      LEFT OUTER JOIN TableB As B ON A.Id = B.TabaleAId 
     WHERE B.Column IS NULL 
    ) 
Delete From A 
1

La forma más fácil para borrar basa en unirse es el siguiente: 1. Escribe tu consulta utilizando instrucción SELECT en lugar de instrucción DELETE

SELECT COLUMNS 
    FROM Table1 
      INNER JOIN Table2 ON Table1.YYY = Table2.XXX 

2. Sustituir columnas SELECT con DELETE FROM TABLA

DELETE FROM Table1 
    FROM Table1 
      INNER JOIN Table2 ON Table1.YYY = Table2.XXX 

Tenga en cuenta que necesitamos especificar FROM dos veces, una para DELETE y otra para JOIN.

1
DELETE FROM a 
    FROM TableA AS a LEFT OUTER JOIN TableB AS b 
    on a.CALENDAR_DATE = b.CALENDAR_DATE AND a.ID = b.ID 
    Where b.ID is null 

Se puede utilizar por primera vez la instrucción de selección y verificar sus registros que desee eliminar y quitar la instrucción de selección y añadir Eliminar en nombre de tabla con la sintaxis de consulta anterior.

Cuestiones relacionadas