在 SQL Server 数据库操作中,有时需要根据表之间的关联关系删除特定的数据。使用 INNER JOIN 可以将多个表进行关联,从而筛选出需要删除的数据。
实现步骤
单表删除(使用别名)
在 DELETE 和 FROM 之间添加要删除记录的表名,并指定表的别名,同时移除 ORDER BY 子句。示例代码如下:
1 2 3 4 5
DELETE w FROM WorkRecord2 w INNERJOIN Employee e ON w.EmployeeRun = e.EmployeeNo WHERE w.Company ='1'AND w.Date ='2013-05-06';
单表删除(不使用别名)
1 2 3 4 5 6
DELETE WorkRecord2 FROM WorkRecord2 INNERJOIN Employee ON WorkRecord2.EmployeeRun = Employee.EmployeeNo WHERE WorkRecord2.Company ='1' AND WorkRecord2.Date ='2013-05-06';
使用子查询删除
1 2 3 4 5 6
DELETEFROM WorkRecord2 WHERE EmployeeRun IN ( SELECT e.EmployeeNo FROM Employee e WHERE ... );
使用 EXISTS 子句删除
1 2 3 4 5 6 7
DELETEFROM WorkRecord2 WHEREEXISTS( SELECT1 FROM Employee e WHERE WorkRecord2.EmployeeRun = e.EmployeeNo AND .... );
多表删除(使用事务、表变量和 JOIN)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
BEGIN TRANSACTION;
declare@deletedIdstable ( id int );
DELETE w output deleted.EmployeeRun into@deletedIds FROM WorkRecord2 w INNERJOIN Employee e ON e.EmployeeNo = w.EmployeeRun AND w.Company =1 AND w.date ='2013-05-06';
DELETE e FROM Employee as e INNERJOIN@deletedIdsas d ON d.id = e.EmployeeNo;
-- INSERT INTO #deletedRecords SELECT e.EmployeeNo FROM WorkRecord2 w INNERJOIN Employee e ON e.EmployeeNo = w.EmployeeRun AND w.Company =1 AND w.date ='2013-05-06';
-- delete from WorkRecord2 DELETE w FROM WorkRecord2 w INNERJOIN #deletedRecords d ON w.EmployeeRun = d.employeeId;
-- delete from Employee using exists DELETE FROM Employee WHEREEXISTS (SELECT1 FROM #deletedRecords d WHERE d.employeeId = EmployeeNo);
-- drop temporary table DROPTABLE #deletedRecords;
COMMIT TRANSACTION;
使用 CTE 删除
1 2 3 4 5 6 7 8 9
;WITH cte AS (SELECT* FROM workrecord2 w WHEREEXISTS (SELECT1 FROM employee e WHERE w.employeerun = e.employeeno AND w.company ='1' AND w.date ='2013-05-06')) DELETEFROM cte;
使用 MERGE 删除
1 2 3 4 5 6
MERGE WorkRecord2 T USING Employee S ON T.EmployeeRun = S.EmployeeNo AND T.Company ='1' AND T.Date ='2013-05-06' WHEN MATCHED THENDELETE;