2016-06-22 1 views
2

Par exemple,Comment supprimer deux tables en même temps?

DELETE table1., table2. FROM table1, table2 WHERE (((table1.[Field1])=table2.[Field1])); 
+1

Pourquoi ne pouvez-vous pas supprimer un par un? – Igoranze

+1

Il n'y a pas de solution ANSI-SQL car le standard SQL ne le permet pas (et en plus: '[Field1]' n'est pas un identifiant valide dans ANSI SQL pour commencer). Mais certains SGBD ont des extensions qui vous permettraient de le faire. Quel SGBD utilisez-vous? Postgres? Oracle? –

Répondre

2

Vous pouvez utiliser DELETE CASCADE qui supprime un élément et tout autre qui en dépend. Par exemple, si vous avez une table d'étudiant, une table de cours et une table d'abonnement qui énumère tous les cours qu'un étudiant veut suivre, vous pouvez supprimer un étudiant et n'importe quelle entrée liée à lui dans le tableau d'abonnement avec CASCADE.

1

Je suggérerais emboîtés Curseurs:

DECLARE @OuterVar [datatype]; 
DECLARE @OuterPKey [datatype]; 
DECLARE @InnerPKey [datatype]; 

DECLARE OuterCursor CURSOR 
FOR SELECT table1.[Field1], table1.[PrimaryKey] 
FROM table1; 

OPEN OuterCursor 
FETCH NEXT FROM OuterCursor INTO @OuterVar, @OuterPKey; 

WHILE @@FETCH_STATUS = 0 
BEGIN 

DECLARE InnerCursor CURSOR 
FOR SELECT table2.[PrimaryKey] 
FROM table2 
WHERE table2.[Field2] = @OuterVar; 

OPEN InnerCursor; 

WHILE @@FETCH_STATUS = 0 
BEGIN 

DELETE FROM table1 WHERE [PrimaryKey] = @OuterPKey; 
DELETE FROM table2 WHERE [PrimaryKey] = @InnerPKey; 

FETCH NEXT FROM InnerCursor INTO @InnerPKey; 

END; 

CLOSE InnerCursor; 
DEALLOCATE InnerCursor; 

FETCH NEXT FROM OuterCursor INTO @OuterVar, @OuterPKey; 

END; 

CLOSE OuterCursor; 
DEALLOCATE OuterCursor; 

Cette boucle permet de faire défiler tous les enregistrements dans le tableau 1, et pour chaque enregistrement, il trouvera les enregistrements dans table2 où les valeurs de table1 [Field1] et table2. . [Field2] sont les mêmes. Ensuite, il va supprimer les deux enregistrements.