Как удалить из нескольких таблиц с помощью INNER JOIN на SQL-сервере

В MySQL вы можете использовать синтаксис

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

Как мне сделать то же самое в SQL Server?

Вы можете использовать «удаленную» псевдо-таблицу в этом примере. Что-то вроде:

 begin transaction; declare @deletedIds table ( id int ); delete t1 output deleted.id into @deletedIds from table1 t1 join table2 t2 on t2.id = t1.id join table3 t3 on t3.id = t2.id; delete t2 from table2 t2 join @deletedIds d on d.id = t2.id; delete t3 from table3 t3 ... commit transaction; 

Очевидно, вы можете сделать вывод «удаленным». на втором удалите, если вам нужно что-то, чтобы присоединиться к третьей таблице.

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

EDIT: Также вы рассмотрели возможность добавления триггера в таблицу1 для удаления из таблицы2 + 3? Вы будете внутри неявной транзакции, а также будете иметь доступные «вставленные » и «удаленные » псевдотаблицы.

  1. Вы всегда можете настроить каскадные удаления в отношениях между таблицами.

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

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

Пример для удаления некоторых записей из главной таблицы и соответствующих записей из двух таблиц подробностей:

 BEGIN TRAN -- create temporary table for deleted IDs CREATE TABLE #DeleteIds ( Id INT NOT NULL PRIMARY KEY ) -- save IDs of master table records (you want to delete) to temporary table INSERT INTO #DeleteIds(Id) SELECT DISTINCT mt.MasterTableId FROM MasterTable mt INNER JOIN ... WHERE ... -- delete from first detail table using join syntax DELETE d FROM DetailTable_1 D INNER JOIN #DeleteIds X ON D.MasterTableId = X.Id -- delete from second detail table using IN clause DELETE FROM DetailTable_2 WHERE MasterTableId IN ( SELECT X.Id FROM #DeleteIds X ) -- and finally delete from master table DELETE d FROM MasterTable D INNER JOIN #DeleteIds X ON D.MasterTableId = X.Id -- do not forget to drop the temp table DROP TABLE #DeleteIds COMMIT 

Синтаксис 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; 

Просто интересно … это действительно возможно в MySQL? он удалит t1 и t2? или я просто неправильно понял вопрос.

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

это:

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

должно быть написано так, чтобы работать в MSSQL:

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

чтобы сравнить, как две другие общие РСУБД выполняют операцию удаления:

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

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

В SQL-сервере нет способа удалить несколько таблиц с помощью join. Поэтому сначала нужно удалить из дочернего элемента, прежде чем удалить родительскую форму.

Это альтернативный способ удаления записей, не оставляя сирот.

 Объявить таблицу @user (keyValue int, someString varchar (10))
 вставить в @user
 значения (1, '1 значение')

 вставить в @user
 значения (2, '2 значение')

 вставить в @user
 значения (3, '3 значение')

 Объявить таблицу @password (keyValue int, details varchar (10))
 вставить в @password
 значения (1, '1 Пароль)
 вставить в @password
 значения (2, '2 Password')
 вставить в @password
 значения (3, «3 Пароль»)

         - до удаления
   выберите * from @password внутреннее соединение @user b
                 по значению a.key = b.keyvalue
   выберите * в #deletedID из @user, где keyvalue = 1 - это работает как пример вывода
   delete @user, где keyvalue = 1
   delete @password, где keyvalue in (выберите значение ключа из #deletedid)

   - После удаления -
   выберите * from @password внутреннее соединение @user b
                 по значению a.key = b.keyvalue

Все было указано. Просто используйте DELETE ON CASCADE в родительской table или удалите из child-table parent .

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

Чтобы построить ответ Джона Гибба, для удаления набора данных в двух таблицах с отношением FK:

 --*** To delete from tblMain which JOINs to (has a FK of) tblReferredTo's PK -- ie ON tblMain.Refer_FK = tblReferredTo.ID --*** !!! If you're CERTAIN that no other rows anywhere also refer to the -- specific rows in tblReferredTo !!! BEGIN TRAN; --*** Keep the ID's from tblReferredTo when we DELETE from tblMain DECLARE @tblDeletedRefs TABLE ( ID INT ); --*** DELETE from the referring table first DELETE FROM tblMain OUTPUT DELETED.Refer_FK INTO @tblDeletedRefs -- doesn't matter that this isn't DISTINCT, the following DELETE still works. WHERE ..... -- be careful if filtering, what if other rows -- in tblMain (or elsewhere) also point to the tblReferredTo rows? --*** Now we can remove the referred to rows, even though tblMain no longer refers to them. DELETE tblReferredTo FROM tblReferredTo INNER JOIN @tblDeletedRefs Removed ON tblReferredTo.ID = Removed.ID; COMMIT TRAN; 
 DELETE TABLE1 LIN FROM TABLE1 LIN INNER JOIN TABLE2 LCS ON CONDITION WHERE CONDITION 

$ sql = "DELETE FROM basic_tbl , education_tbl , personal_tbl , address_tbl , department_tbl ИСПОЛЬЗОВАНИЕ basic_tbl , education_tbl , personal_tbl , address_tbl , department_tbl WHERE b_id = e_id = p_id = a_id = d_id = '". $ id. "'"; $ Rs = mysqli_query ($ против, $ SQL);

Давайте будем гением компьютера.