Как я удаляю из нескольких таблиц с помощью ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ в SQL-сервере

Свифт не знает, может ли == 2 работать с dict["u"]. Вы знаете, что dict["u"] - это Int, но Swift этого не знает, потому что, вводя эти словари как NSMutableDictionary, вы скрывали типы значений.

Чтобы это исправить, измените [NSMutableDictionary] на [[String:Int]].

107
задан OMG Ponies 14 October 2011 в 03:07
поделиться

8 ответов

You can take advantage of the "deleted" pseudo table in this example. Something like:

begin transaction;

   declare @deletedIds table ( id int );

   delete from t1
   output deleted.id into @deletedIds
   from table1 as t1
    inner join table2 as t2
      on t2.id = t1.id
    inner join table3 as t3
      on t3.id = t2.id;

   delete from t2
   from table2 as t2
    inner join @deletedIds as d
      on d.id = t2.id;

   delete from t3
   from table3 as t3 ...

commit transaction;

Obviously you can do an 'output deleted.' on the second delete as well, if you needed something to join on for the third table.

As a side note, you can also do inserted.* on an insert statement, and both inserted.* and deleted.* on an update statement.

EDIT: Also, have you considered adding a trigger on table1 to delete from table2 + 3? You'll be inside of an implicit transaction, and will also have the "inserted." and "deleted." pseudo-tables available.

112
ответ дан 24 November 2019 в 03:41
поделиться
  1. Вы всегда можете настроить каскадное удаление в связях таблиц.

  2. Вы можете инкапсулировать несколько удалений в одной хранимой процедуре.

  3. Вы можете использовать транзакцию для обеспечения одного блока работы.

15
ответ дан 24 November 2019 в 03:41
поделиться

Вы можете использовать синтаксис JOIN в предложении FROM в DELETE в SQL Server, но вы все равно удаляете только из первой таблицы, и это собственное расширение Transact-SQL, которое является альтернативой подзапросу.

Из примера здесь :

 -- Transact-SQL extension
 DELETE 
   FROM Sales.SalesPersonQuotaHistory 
     FROM Sales.SalesPersonQuotaHistory AS spqh INNER JOIN 
          Sales.SalesPerson AS sp ON spqh.BusinessEntityID = sp.BusinessEntityID
    WHERE sp.SalesYTD > 2500000.00;
14
ответ дан 24 November 2019 в 03:41
поделиться

Just wondering.. is that really possible in MySQL? it will delete t1 and t2? or I just misunderstood the question.

But if you just want to delete table1 with multiple join conditions, just don't alias the table you want to delete

this:

DELETE t1,t2 
FROM table1 AS t1 
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...

should be written like this to work in MSSQL:

DELETE table1
FROM table1 
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...

to contrast how the other two common RDBMS do a delete operation:

http://mssql-to-postgresql.blogspot.com/2007/12/deleting-duplicates-in-postgresql-ms.html

9
ответ дан 24 November 2019 в 03:41
поделиться

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

7
ответ дан 24 November 2019 в 03:41
поделиться

In SQL server there is no way to delete multiple tables using join. So you have to delete from child first before delete form parent.

3
ответ дан 24 November 2019 в 03:41
поделиться

Как уже указывал Аарон, вы можете установить поведение удаления в CASCADE, и это будет удалять дочерние записи при удалении родительской записи. Если вы не хотите, чтобы случилась какая-то другая магия (в этом случае пункты 2, 3 ответа Аарона были бы полезны), я не понимаю, зачем вам нужно удалять с помощью внутренних объединений.

1
ответ дан 24 November 2019 в 03:41
поделиться

Все уже было указано. Просто используйте либо DELETE ON CASCADE на родительской таблице, либо удаление из дочерней таблицы в родительскую.

2
ответ дан 24 November 2019 в 03:41
поделиться