2016-06-22 3 views
2

Например,Как удалить из двух таблиц одновременно?

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

Почему вы не можете просто удалить один за другим? – Igoranze

+1

Нет решения ANSI-SQL, поскольку стандарт SQL этого не допускает (и, кроме того: '[Field1]' не является допустимым идентификатором в ANSI SQL для начала). Но в некоторых СУБД есть расширения, которые позволят вам это сделать. Какие СУБД вы используете? Postgres? Oracle? –

ответ

2

Вы можете использовать DELETE CASCADE, которая удаляет элемент и любой другой, который зависит от него.

Например, если у вас есть таблица учащихся, таблица курса и таблица подписки, в которой перечислены все курсы, которые хочет выполнить студент, вы можете удалить учащегося и любую связанную с ним связь в таблице подписки с помощью CASCADE.

1

Я хотел бы предложить вложенные курсоры:

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; 

Это будет перебрать все записи в table1, и для каждой записи, он будет найти записи в table2 где значение table1 [Field1] и table2. . [Поле2] совпадают. Затем он удалит обе записи.