2010-01-22 11 views
5

¿cómo puedo eliminar de la tabla A mientras comparo dos campos A.P y A.C con B.P y B.C de la tabla B mientras busco todas las coincidencias de B.R = 1?SQL - cómo eliminar de una tabla mientras se hace referencia desde otra tabla?

realidad ninguno de los siguientes trabajos, sino que debe ir en la dirección, por desgracia no puedo encontrar la manera ...

DELETE FROM A WHERE (A.P = B.P AND A.C = B.C where B.C = 1) 

DELETE FROM A WHERE (SELECT B.P, B.C FROM B WHERE B = 1) 
+0

Qué 'RDBMS' está usando? – Quassnoi

+0

SQLite ........ – mgmx

Respuesta

2
DELETE 
FROM A 
WHERE EXISTS 
     (
     SELECT NULL 
     FROM b 
     WHERE b.p = a.p 
       AND b.c = a.c 
       AND b.r = 1 
     ) 
+0

@Quassnoi: ¿Mi consulta no sería más rápida? – Hogan

+0

No, no lo hará. En 'SQL Server' (que es el único' RDBMS' funcionará su consulta), en los campos no indexados 'JOIN' es menos eficiente que' IN' o 'EXISTS'. Si los campos son únicos o están indexados correctamente, entonces 'JOIN' tendrá la misma eficacia. http://explainextended.com/2009/06/16/in-vs-join-vs-exists/ – Quassnoi

+0

¡¡¡Realmente funciona a la perfección !! También con SQLite ... – mgmx

4
DELETE FROM A 
FROM A INNER JOIN B ON A.P = B.P AND A.C = B.C 
WHERE B.C = 1 

El doble DE tiros a veces a la gente.

+0

lamentablemente no funciona con SQLite. – mgmx

1
DELETE FROM A WHERE A.Id IN 
(SELECT A.Id FROM A INNER JOIN B ON A.P = B.P WHERE B.C = 1) 
0

Usted está solicitando que eliminar todos los registros de la A que tienen un valor de C = C en el valor de la fila de la tabla B que tiene C = 1 y el mismo valor de p ??

Eso es lo mismo que eliminar todas las filas en A que tienen el valor C = 1 [y el mismo valor P en la Tabla B].

modo Prueba esto:

Delete A 
Where C = 1 
    And Exists 
     (Select * From B 
     Where C = 1 
     And P = A.P) 
0

algo como esto funcionaría

DELETE FROM A 
FROM A 
INNER JOIN B ON A.P = B.P AND A.C = B.C AND B.R = 1 
Cuestiones relacionadas