为何操作CTE执行DELETE会导致Employee主表数据被删除?
问题:对CTE执行DELETE为何删除了Employee主表数据
相关截图
- Employee表初始数据:

- 执行的操作语句:

- 执行结果:

我无法理解为何Employee表的数据会被删除,明明是对CTE执行DELETE操作而非直接操作主表,恳请技术人员帮忙解答。
原因解析
这是因为CTE(公共表表达式)本质上是与底层表绑定的逻辑视图,并非独立的数据副本。当你对CTE执行DELETE操作时,数据库引擎会把这个操作直接映射到底层的Employee物理表——只要CTE是直接基于主表定义、没有使用聚合、分组、去重等会生成不可更新结果集的操作,对CTE的修改就会直接作用于源表。
从你提供的操作语句来看,你的CTE只是简单筛选了Employee表中Salary > 5000的行,属于可更新的CTE。这种情况下,DELETE操作会被数据库解析为:删除Employee表中满足Salary > 5000的记录,自然会导致主表数据被删除。
如果想要避免修改主表,你需要将CTE的数据生成临时表或物理副本,比如执行SELECT ... INTO #TempTable FROM Employee WHERE Salary > 5000,再对临时表进行操作。
内容的提问来源于stack exchange,提问作者sourav moha
相关产品推荐
相关产品推荐

