如何在SQL Server中使用INNER JOIN从多个表中删除数据?
如何在SQL Server中使用INNER JOIN从多个表中删除数据?
在MySQL中,你可以使用以下语法:
DELETE t1,t2 FROM table1 AS t1 INNER JOIN table2 t2 ... INNER JOIN table3 t3 ...
。如何在SQL Server中执行相同的操作?
admin 更改状态以发布 2023年5月21日
您可以在SQL Server的DELETE语句中的FROM子句中使用JOIN语法,但是您仍然只能从第一个表中删除,并且这是一种专有的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 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;
显然,如果你需要在第三张表上进行连接,你也可以在第二个删除语句上使用“输出删除”。
另外,你也可以在插入语句中使用 inserted.*,在更新语句中同时使用 inserted.* 和 deleted.*。
编辑:
此外,你考虑在 table1 上添加一个触发器来删除 table2 + 3 吗?这样你会处于一个隐式事务中,并且也会有“inserted.”和“deleted.”伪表可用。