SQL Server在IN子查询的字段不存在时会误删除记录
编号:QA003233
建立日期: 2000年8月1日 最后修改日期:2000年8月1日
所属类别:
文章:
我在一次调试程序时发现了SQL 6.5 的一个问题,不知道算不算BUG。
我使用的是VB6 SQL65
在一个MIS系统中有表 DB 结构及记录如下:
编号 产品编号 数量 单价
89197 B91420132463 10.00 570.00
89197 B71200110463 2.00 440.00
89197 B71200110483 20.00 440.00
89197 B71200110463 10.00 440.00
CPZ结构及记录如下:
编号 客户编号 年初数 仓库
B71200110463 1 1仓库
B71200110483 4 2仓库
B91420132463 3 1仓库
如果我通过程序执行如下语句:
Delete from db
where db.产品编号 IN ( Select 产品编号 From CPZ Where 仓库='1仓库')
and db.编号= 89195
目的是希望删除DB中所有编号为98195且在CPZ中出现 且仓库为 1仓库的商品。但如果按照上面的执行语句执行,其结果是将DB中所有为89195的记录全部删除。当然不是我期望的结果,且在执行时没有认可编译和执行错误。
最后我才发现原来是 IN子查询中的 “产品编号” 字段在CPZ中根本没有存在,我将语句写成如下:
Delete from db
where db.产品编号 IN ( Select 编号 From CPZ Where 仓库='1仓库') and db.编号= 89195
则一切正常并且达到了我的执行目的。
(而这种书写错误在大型开发中是经常出现的),按照常规情况,在子查询提供的表中如果没有该字段,其应该提示错误信息,可象我上面的语句,没有提示任何错误。我将这个小小的发现提供给大家,是希望大家在进行类似的SQL调试时少浪费宝贵时间。
文章来源:XU03。
| |
|
|
| |
|
|