В MySQL вы можете использовать синтаксис
DELETE t1,t2
FROM table1 AS t1
INNER JOIN table2 t2 ...
INNER JOIN table3 t3 ...
Как мне сделать то же самое в SQL Server?
В 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 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;
Очевидно, вы можете сделать «вывод удален». на втором удаляем также, если вам нужно было что-то присоединить к третьей таблице.
В качестве дополнительного примечания вы также можете сделать вставленный. * В операторе вставки и как вставленный. *, Так и удаленный. * В операторе обновления.
РЕДАКТИРОВАТЬ: Кроме того, рассматривали ли вы добавление триггера в table1 для удаления из table2 + 3? Вы будете внутри неявной транзакции, и вам также будут доступны псевдотаблицы «вставлено » и «удалено ».
Вы всегда можете настроить каскадное удаление для отношений таблиц.
Вы можете инкапсулировать несколько удалений в одной хранимой процедуре.
Вы можете использовать транзакцию, чтобы гарантировать одну единицу работы.
Вы можете использовать синтаксис 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;
Пример удаления некоторых записей из основной таблицы и соответствующих записей из двух подробных таблиц:
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
SELECT INTO #DeleteIdsвместо " CREATE TABLE 'DeleteIdsпосле" INSERT INTO 'DeleteIds...?
Просто интересно .. действительно ли это возможно в MySQL? он удалит t1 и t2? или я просто неправильно понял вопрос.
Но если вы просто хотите удалить table1 с несколькими условиями соединения, просто не используйте псевдоним для таблицы, которую хотите удалить.
этот:
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
По сути, нет, вам нужно сделать три оператора удаления в транзакции, сначала дочерние элементы, а затем родители. Настройка каскадных удалений - хорошая идея, если это не одноразовая вещь, и ее существование не будет противоречить любой существующей настройке триггера.
Это альтернативный способ удаления записей, не оставляя сирот.
Объявить @user Table (keyValue int, someString varchar (10))
вставить в @user
значения (1, '1 значение')
вставить в @user
значения (2, '2 значения')
вставить в @user
значения (3, '3 значения')
Объявить таблицу @password (keyValue int, подробности varchar (10))
вставить в @password
значения (1, '1 пароль')
вставить в @password
значения (2, '2 Пароль')
вставить в @password
значения (3, '3 Пароль')
- перед удалением
выберите * из @password a внутреннее соединение @user b
на a.keyvalue = b.keyvalue
выберите * в #deletedID из @user, где keyvalue = 1 - это работает как пример вывода
удалить @user, где keyvalue = 1
удалить @password, где ключевое значение в (выберите ключевое значение из #deletedid)
--После удаления--
выберите * из @password a внутреннее соединение @user b
на a.keyvalue = 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
-- i.e. 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);