You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:17:41