CTE SQL误删Table B而非Table A,请求修正SQL语句
问题原因分析
你写的CTE虽然命名为tableA,但实际是从tableB中查询数据,而SQL Server中可更新的CTE会直接操作其底层的源表。所以执行DELETE FROM tableA时,实际上是删除了CTE对应的tableB中的100条数据,完全没涉及到你真正要操作的物理表Table A。
修正后的SQL
方式一:用CTE关联目标表删除
WITH targetRecords AS ( SELECT TOP (100) b.txn_id, b.customer_id FROM tableB b WHERE b.create_date < DATEADD(DAY, DATEDIFF(DAY, 1500, GETDATE()), 0) ORDER BY b.create_date ASC ) DELETE a FROM TableA a INNER JOIN targetRecords tr ON a.txn_id = tr.txn_id AND a.customer_id = tr.customer_id;
方式二:直接使用JOIN删除(更简洁)
DELETE a FROM TableA a INNER JOIN ( SELECT TOP (100) txn_id, customer_id FROM tableB WHERE create_date < DATEADD(DAY, DATEDIFF(DAY, 1500, GETDATE()), 0) ORDER BY create_date ASC ) b ON a.txn_id = b.txn_id AND a.customer_id = b.customer_id;
关键说明
- 避免CTE命名和物理表名混淆,改用
targetRecords这类清晰的名称,防止误操作 - 明确指定要删除的是物理表
TableA的记录(DELETE a中的a是TableA的别名) - 通过
INNER JOIN关联筛选出的tableB关键字段,精准匹配要删除的TableA数据
内容的提问来源于stack exchange,提问作者Kaninchen
相关产品推荐
相关产品推荐

