sql - SQL 如何处理(或不处理)where 子句中的错误?

标签 sql sql-server

我不小心删除了 MULTIPLECALCCLASSDEF 表中的所有行,内容如下:

delete
from MULTIPLECALCCLASSDEF
where SCHEMEHISTID in (select SCHEMEHISTID from SCHEME where SCHEMEID = @intScheme)

最初看起来不错。问题似乎是 SCHEME 表中没有 SCHEMEHISTID,但既然如此,为什么 where 子句不返回错误,或者不返回行?

此错误(无效的列名称 SCHEMEHISTID):

select SCHEMEHISTID from SCHEME where SCHEMEID = @intScheme

但这不是:

select *
from MULTIPLECALCCLASSDEF
where SCHEMEHISTID in (select SCHEMEHISTID from SCHEME where SCHEMEID = @intScheme)

最佳答案

一般来说,您应该使用表别名和限定列名(包括表别名)。当您使用相关子查询时尤其如此。您刚刚发现了原因。

您想要的查询是:

delete c
    from MULTIPLECALCCLASSDEF c
    where c.SCHEMEHISTID in (select s.SCHEMEHISTID from SCHEME s where s.SCHEMEID = @intScheme);

这会产生错误。

如果没有别名,查询将被解释为:

delete c
    from MULTIPLECALCCLASSDEF c
    where c.SCHEMEHISTID in (select c.SCHEMEHISTID from SCHEME s where s.SCHEMEID = @intScheme);

好吧,假设 where 存在任何匹配,则 SCHEMEHISTID 的任何非 NULL 值都可以轻松满足 in

简单的解决方案:始终使用限定的列名称。

关于sql - SQL 如何处理(或不处理)where 子句中的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37567056/

相关文章:

c# - 使用sqlserver 2005在特定位置插入值

java - ebean java play框架中的约束未反射(reflect)在生成的sql中

mysql SQL查询比较整数和字符串

mysql - 使用多个表时 MySQL 中会发生什么

java - 无法访问 PUBLIC 模式中的表

sql-server - 使用过滤统计的情况

sql - 跨多个列删除具有重复值的行

sql - 外键中的空值

c# - 如何在 asp.net mvc 4 的服务器上缓存数据?

java - 如何通过java将数据库字段中的时间分别转换为小时、分钟、秒的整数?