delete in 事故清表

DELETE FROM dbo.FW_TASK_ACCEPT
    WHERE TASK_ID IN ( SELECT TASK_ID
                        FROM dbo.FW_TASK );

上述是事故语句

按照字面的的语法本身没什么错误,编译也不会报错。导致删除表全部数据根源在于上下文,或者说作用域,这里我个人这个称呼便于理解

有一个基础的问题就是再子查询中 select 字段的时候是可以查询外层 “字段 ” 的,这就是主要的事故原因。我们看子查询中 TASK_ID  这里因为失误 写成了  

SELECT TASK_ID  FROM dbo.FW_TASK  其实  dbo.FW_TASK  表中并没有这个  TASK_ID  字段,但是因为作用域关系  SELECT TASK_ID  也是合法的,只不过是上层的   TASK_ID,那

这样就明了了,DELETE  删除时逐条删的,那么每一次  SELECT TASK_ID  都是自己的   TASK_ID,所以会删除 dbo.FW_TASK_ACCEPT 表中全部数据。

总结:

1.DELETE FROM ...  WHERE   必须带  WHERE

2.语句操作必须带重命名,如:

DELETE FROM dbo.FW_TASK_ACCEPT
    WHERE TASK_ID IN ( SELECT fTask.ID
                        FROM dbo.FW_TASK fTask);

3.理解掌握Sql语法

原文地址:https://www.cnblogs.com/myloveblogs/p/14338499.html