2009-11-11 26 views
17

Ésta es la consulta que estoy usando:Eliminar filas de varias tablas utilizando una única consulta (SQL Express 2005) con una condición WHERE

DELETE TB1.*, TB2.* 
    FROM TB1 
     INNER JOIN TB2 ON TB1.PersonID = TB2.PersonID 
    WHERE (TB1.PersonID)='2' 

Está funcionando muy bien en MS Access pero conseguir de error (sintaxis incorrecta cerca ','.) en SQL Server Express 2005.

¿Cómo resolverlo? Por favor ayuda.

+2

Es esto posible ahora con SQL Server 2012 o 2014? Tengo un conjunto de tablas horriblemente construidas para mi proyecto de clase que tiene restricciones de RESTRICCIÓN EN ELIMINACIÓN en ambas tablas a la vez. No quiero hacer otra pregunta, ya que sería una estafa. – trysis

Respuesta

11

¿Por qué no usa un DELETE CASCADE FK?

17

No puede DELETE de varias tablas con una sola expresión en SQL 2005 - o cualquier otro SQL estándar para ese asunto. Access es la excepción aquí.

El mejor método para obtener este efecto es especificar FOREIGN KEYS entre la tabla con ONDELETEtrigger.

+0

Debe ser por eso que obtengo un 'error de sintaxis incorrecta en la coma que separa las tablas' DELETE table1, table2 'Sintaxis incorrecta cerca de', '. – Rich

3

Esto no se puede hacer en una sola declaración. Deberá usar 2 instrucciones

DELETE FROM TB1 WHERE PersonID = '2'; 
DELETE FROM TB2 WHERE PersonID = '2'; 
2

Como sé, no puede hacerlo en una oración.

Pero puede crear un procedimiento almacenado que realice las eliminaciones que desee en cualquier tabla de una transacción, lo que es casi lo mismo.

1

No creo que pueda eliminar de varias tablas a la vez (aunque no estoy seguro).

Me parece, sin embargo, que lo mejor sería lograr este efecto con una relación que elimina cascadas. Si hiciera esto, podría eliminar el registro de una tabla y los registros en la otra se borrarían automáticamente.

Como ejemplo, supongamos que las dos tablas representan un cliente y las órdenes del cliente. Si configura la relación para eliminar en cascada, simplemente puede eliminar el registro en la tabla de clientes y las órdenes se eliminarán automáticamente.

Consulte el documento de MSDN en cascading referential integrity constraints.

1

Especifique la clave externa para las tablas de detalles que hace referencia a la clave primaria de maestro y establezca Eliminar regla = Cascada.

Ahora cuando elimina un registro de la tabla maestra, todos los demás registros de la tabla de detalles basados ​​en el valor de la clave primaria de eliminación de filas, se eliminarán automáticamente.

Por lo tanto, en ese caso, una sola consulta de eliminación de la tabla maestra puede eliminar datos de tablas maestras, así como datos de tablas secundarias.

0

Usted puede usar algo como lo siguiente:

DECLARE db_cursor CURSOR FOR 
SELECT name 
FROM master.dbo.sysdatabases 
WHERE name IN ("TB2","TB1") -- use these databases 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @name 


WHILE @@FETCH_STATUS = 0 
BEGIN 

     DELETE FROM @name WHERE PersonID ='2' 

     FETCH NEXT FROM db_cursor INTO @name 
END 
-1
DELETE TB1, TB2 
    FROM customer_details 
     LEFT JOIN customer_booking on TB1.cust_id = TB2.fk_cust_id 
    WHERE TB1.cust_id = $id 
+0

Una simple explicación en inglés no dolería. Ver http://stackoverflow.com/help/how-to-answer – Jubobs

0
CREATE PROCEDURE sp_deleteUserDetails 
    @Email varchar(255) 
AS 
    declare @tempRegId as int 
    Delete UserRegistration where [email protected] 
    set @tempRegId = (select Id from UserRegistration where Email = @Email) 
    Delete UserProfile where [email protected] 

RETURN 0 
0

que pueden unirse como esto

DELETE t2 
    FROM TB1 t1 
     INNER JOIN TB2 t2 ON t1.PersonID = t2.PersonID 
    WHERE t1.PersonID = '2' 

sino como Alex mencionó, sólo uno a la vez.

Usted necesita limitación en cascada sobre la mesa para hacer todo a la vez

-1

Intentar esta consulta

DELETE TB1, TB2 FROM TB1 INNER JOIN TB2 
WHERE TB1.PersonID = TB2.PersonID and TB1.PersonID = '2' 
Cuestiones relacionadas