tipos resueltos ejercicios ejemplos datos consultas complejas sql sql-server sql-server-express sql-server-2005-express

resueltos - Elimine filas de varias tablas mediante una única consulta(SQL Express 2005) con una condición DÓNDE



tipos de consultas en mysql (12)

Esta es la consulta que estoy usando:

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

Funciona bien en MS Access, pero aparece un error (Sintaxis incorrecta cerca de '',''.) En SQL Server Express 2005.

¿Cómo resolverlo? Por favor ayuda.


¿Por qué no usas un DELETE CASCADE FK ?


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

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


Especifique la clave externa para las tablas de detalles que hacen referencia a la clave principal del maestro y establezca Delete rule = Cascade.

Ahora, cuando elimine 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 las filas eliminadas, se eliminarán automáticamente.

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


Esto no se puede hacer en una declaración. Tendrás que usar 2 sentencias.

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


Lo uso para limpiar datos en bases de datos de prueba / desarrollo. Puede filtrar por nombre de tabla y recuento de registros.

DECLARE @sqlCommand VARCHAR(3000); DECLARE @tableList TABLE(Value NVARCHAR(128)); DECLARE @TableName VARCHAR(128); DECLARE @RecordCount INT; -- get a cursor with a list of table names and their record counts DECLARE MyCursor CURSOR FAST_FORWARD FOR SELECT t.name TableName, i.rows Records FROM sysobjects t, sysindexes i WHERE t.xtype = ''U'' -- only User tables AND i.id = t.id AND i.indid IN(0, 1) -- 0=Heap, 1=Clustered Index AND i.rows < 10 -- Filter by number of records in the table AND t.name LIKE ''Test_%''; -- Filter tables by name. You could also provide a list: -- AND t.name IN (''MyTable1'', ''MyTable2'', ''MyTable3''); -- or a list of tables to exclude: -- AND t.name NOT IN (''MySpecialTable'', ... ); OPEN MyCursor; FETCH NEXT FROM MyCursor INTO @TableName, @RecordCount; -- for each table name in the cursor, delete all records from that table: WHILE @@FETCH_STATUS = 0 BEGIN SET @sqlCommand = ''DELETE FROM '' + @TableName; EXEC (@sqlCommand); FETCH NEXT FROM MyCursor INTO @TableName, @RecordCount; END; CLOSE MyCursor; DEALLOCATE MyCursor;

Información de referencia:


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

Sin embargo, me parece que sería mejor lograr este efecto con una relación que las cascadas eliminan. Si lo hiciera, podría eliminar el registro de una tabla y los registros de la otra se eliminarán automáticamente.

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

Consulte el documento de MSDN sobre las restricciones de integridad referencial en cascada .


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

El mejor método para obtener este efecto es especificar FOREIGN KEYS entre la tabla con un trigger ON DELETE .


Prueba esta consulta

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


Puedes 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


te puedes unir así

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

pero como Alex mencionó, solo uno a la vez.

Necesitas la restricción de cascada en la tabla para hacer todo a la vez


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


DELETE TB1, TB2 FROM customer_details LEFT JOIN customer_booking on TB1.cust_id = TB2.fk_cust_id WHERE TB1.cust_id = $id