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