Dies ist die Abfrage, die ich verwende:
DELETE TB1.*, TB2.*
FROM TB1
INNER JOIN TB2 ON TB1.PersonID = TB2.PersonID
WHERE (TB1.PersonID)='2'
Es funktioniert in MS Access einwandfrei, es wird jedoch ein Fehler (falsche Syntax in der Nähe von ','.) In SQL Server Express 2005 angezeigt.
Wie man es löst? Bitte helfen.
Sie können DELETE
nicht aus mehreren Tabellen mit einem einzelnen Ausdruck in SQL 2005
- oder aus einem anderen Standard-SQL für diese Angelegenheit. Access
ist hier die Ausnahme.
Die beste Methode, um diesen Effekt zu erzielen, besteht darin, FOREIGN KEYS
zwischen der Tabelle mit einer ON
DELETE
trigger
anzugeben.
Warum verwenden Sie keinen DELETE CASCADE FK
?
Dies kann nicht in einer Anweisung gemacht werden. Sie müssen 2 Anweisungen verwenden
DELETE FROM TB1 WHERE PersonID = '2';
DELETE FROM TB2 WHERE PersonID = '2';
Wie ich weiß, kannst du es nicht in einem Satz tun.
Sie können jedoch eine gespeicherte Prozedur erstellen, die die gewünschten Löschungen in jeder beliebigen Tabelle in einer Transaktion vornimmt, was fast gleich ist.
Geben Sie den Fremdschlüssel für die Detailtabellen an, die auf den Primärschlüssel des Masters verweisen, und legen Sie Delete rule = Cascade fest.
Wenn Sie nun einen Datensatz aus der Haupttabelle löschen, werden alle anderen Datensätze der Detailtabellen, die auf dem Primärschlüsselwert der Löschzeilen basieren, automatisch gelöscht.
In diesem Fall können also bei einer einzigen Löschabfrage der Mastertabelle sowohl Stammtabellendaten als auch untergeordnete Tabellendaten gelöscht werden.
Ich glaube nicht, dass Sie aus mehreren Tabellen gleichzeitig löschen können (obwohl ich nicht sicher bin).
Es scheint mir jedoch, dass Sie diesen Effekt am besten mit einer Beziehung erzielen können, die durch Kaskaden gelöscht wird. Wenn Sie dies tun, können Sie den Datensatz aus einer Tabelle löschen, und die Datensätze in der anderen Tabelle werden automatisch gelöscht.
Beispielsweise sagen die beiden Tabellen einen Kunden und die Bestellungen des Kunden aus. Wenn Sie die Beziehung zum Kaskadenlöschen einrichten, können Sie einfach den Datensatz in der Kundentabelle löschen, und die Aufträge werden automatisch gelöscht.
Siehe das MSDN-Dokument zu kaskadierende referenzielle Integritätsbedingungen .
Sie können etwas wie das Folgende verwenden:
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
Ich verwende dies zum Bereinigen von Daten in Test-/Entwicklungsdatenbanken. Sie können nach Tabellennamen und Datensatzanzahl filtern.
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;
Referenzinfo:
sie können so beitreten
DELETE t2
FROM TB1 t1
INNER JOIN TB2 t2 ON t1.PersonID = t2.PersonID
WHERE t1.PersonID = '2'
aber wie Alex erwähnte, nur jeweils eine.
Sie benötigen eine Kaskadenbeschränkung für die Tabelle, um alle gleichzeitig auszuführen
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