wake-up-neo.com

Löschen Sie Zeilen aus mehreren Tabellen mit einer einzigen Abfrage (SQL Express 2005) mit einer WHERE-Bedingung

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.

18
Jobi

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 ONDELETEtrigger anzugeben. 

18
Matijs

Warum verwenden Sie keinen DELETE CASCADE FK?

11
Cesar

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';
3
Adriaan Stander

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.

2
j.a.estevan

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.

1
Himadri

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 .

1
Alex Deem

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  
0
Yablargo

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:

0
Marathon55

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

0
Justin
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
Hari Kumar