如何在SQL Server中使用INNER JOIN从多个表中删除数据?

23 浏览
0 Comments

如何在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日
0
0 Comments

您可以在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;

0
0 Comments

在这个例子中,你可以利用“删除”伪表。类似于:

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.”伪表可用。

0