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/

相关文章:

mysql - 循环引用的 SQL 代码

c# - 如何在 div 向下滚动而不是浏览器窗口向下滚动时加载中继器?

sql-server - 无法删除 View 'XXX',因为它不存在或您没有权限

sql - SQL Server 2008 可以在 WHERE IN 子句中使用变量吗

sql - Mysql DateTime 组按 15 分钟

mysql - 单表 SELF JOIN 备选方案/除外/相交

sql - 从Excel工作表生成sql插入脚本

sql-server - 为什么我需要手动打开这个 .NET Core 数据库连接,而通常 Dapper 自动打开它?

sql - 在 Sql Server 中使用 "IF NOT EXISTS(SELECT..."时,选择哪些列有关系吗?

c# - 将 ASP MVC5 站点部署到 Azure,收到 500 内部服务器错误