SQL Server使用带有子查询的IN运算符似乎是一个BUG?

生姜
select f1 
from table1 
where f1 in (select f1) 
--running OK.

select f1 
from table1 
where f1 in (select f1 from tablex) 
-- even the column f1 does not exist in tablex, running OK.

delete from table1 
where f1 in (select f1 from tablex)
--If you do this, you may have an accident (delete all records from table1) 
--even the column f1 does not exist in tablex.

以上3条SQL语句在SQL Server 2008-2017中都可以正常运行。

粘性位

因为f1没有前缀tablex和不在中,tablex所以它绑定到f1from table1当然table1.f1是在(table1.f1)

这不是错误,而是绑定在SQL中的工作方式。请参见“子查询(SQL Server)”-“限定子查询中的列名称”

(...)如果子查询的FROM子句中引用的表中不存在某列,则该列将由外部查询的FROM子句中引用的表隐式限定。(...)

这是一个很好的例子,为什么养成始终限定列的习惯很有用-至少在涉及多个表时(通过子查询,联接等)。尝试

... in (select tablex.f1 from tablex)

然后您将得到预期的错误。

您还可以使用表别名来缩短合格的列,如下所示:

... in (select x.f1 from tablex x)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SQL Server-数据量很大时使用IN运算符时的查询性能

在SQL Server中的表中存储带有操作数的运算符

使用带有参数的SQL IN运算符的SQL Server Report Builder 3不起作用

一个查询中的多个条件由SQL中的OR运算符分隔

如何使用LIKE运算符编写SQL查询

使用“ LIKE”运算符的嵌套MS Access SQL查询

%(小丑)在我的带有IN运算符的sql查询中不起作用

无法将CASE中带有IN运算符的Spark SQL查询强制转换为SparkPlan

如何使用带有in运算符的oracle sql查询结果?

没有Union运算符SQL的查询

在SQL查询中使用count()运算符

使用LIMIT和BETWEEN运算符的类似子查询的较短SQL语句

SQL Server 2012中带有'AND'运算符的'LIKE'子句

需要帮助,这似乎是一个非常简单的SQL查询

使用带有in运算符的联接时出现sql查询错误

如何在HQL中使用一个类似的运算符在多列中进行搜索(Hibernate SQL)

如何在 SQL Server 中使用带有 like 运算符的 nchar

带有文本数组的 sql IN 运算符

在 mssql 中使用 LIKE 运算符设置 sql 查询

将带有 ANY 运算符的 SQL 查询转换为 Sequelize findAll 函数的问题

在链接的 SQL Server 表上使用参数访问查询 Like 运算符

带有 OR 和 AND 运算符的 MS Access SQL 问题

T-SQL 正则表达式匹配“一个或多个”运算符

为什么运算符AND在tsql中返回错误,这在一般sql中似乎是有效的

使用带有数字的 sql where in 运算符

带有 CASE 的 SQL set WHERE 语句使用 add 运算符放置错误

查询 SQL AND 运算符

带有比较运算符的 SQL 查询

比 SQL 中的 AND 运算符有效的查询