我不小心删除了 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/