[SQL Server] 2005/2008 错误的子查询
2011-02-16 10:58
369 查看
SQL Server (截至当前最新补丁版本2005 SP4, 2008 SP2), 存在一个非常隐蔽的语法问题:当子查询中不存在一个列名A, 但在外层查询中存在列名A,则语法不报错,返回不合理的结果。示例如下:
create table t_test1(col1 int);
insert into t_test1 values(1);
create table t_test2 (col1 int, col2 int);
insert into t_test2 values(1, 10);
insert into t_test2 values(2, 20);
insert into t_test2 values(3, 30);
select * from t_test2 where col2 in (select col2 from t_test1);
-- 最后这个语句,不但未报错"找不到列col2", 而且返回来以下结果集
col1 col2
----------- -----------
1 10
2 20
3 30
(3 行受影响)
原因为: 命令解释进程先解释内层子查询"select col2 from t_test1",这时发现t_test1中没有col2这一列; 它然后再向外层查询寻求解释,恰好发现 外层的t_test2中,含有col2,结果导致它解释后的实际执行的命令,类似于这个语句执行的命令:select * from t_test2 as o where col2 in (select o.col2 from t_test1 as i);
解决方法: 在子查询的列名前,指定表名(或伪名)。
正确写法:select * from t_test2 where col2 in (select i.col2 from t_test1 as i);
create table t_test1(col1 int);
insert into t_test1 values(1);
create table t_test2 (col1 int, col2 int);
insert into t_test2 values(1, 10);
insert into t_test2 values(2, 20);
insert into t_test2 values(3, 30);
select * from t_test2 where col2 in (select col2 from t_test1);
-- 最后这个语句,不但未报错"找不到列col2", 而且返回来以下结果集
col1 col2
----------- -----------
1 10
2 20
3 30
(3 行受影响)
原因为: 命令解释进程先解释内层子查询"select col2 from t_test1",这时发现t_test1中没有col2这一列; 它然后再向外层查询寻求解释,恰好发现 外层的t_test2中,含有col2,结果导致它解释后的实际执行的命令,类似于这个语句执行的命令:select * from t_test2 as o where col2 in (select o.col2 from t_test1 as i);
解决方法: 在子查询的列名前,指定表名(或伪名)。
正确写法:select * from t_test2 where col2 in (select i.col2 from t_test1 as i);
相关文章推荐
- SQL SERVER 2008:内部查询处理器错误: 查询处理器在执行过程中遇到意外错误
- 安装SQL SERVER 2008时出现了SQL SERVER 2005 Express Tool Installed 的错误
- Visual C# 2008+SQL Server 2005 数据库与网络开发--11.3.3 LINQ to SQL的数据库查询
- SQL Server 2008 R2运行分布式的查询时的错误消息:"链接服务器 < 链接服务器 > 的 OLE DB 提供程序 SQLNCLI 返回消息没有事务处于活动状态
- Visual C# 2008+SQL Server 2005 数据库与网络开发--4.4.3 联合查询
- Win7/Vista下安装SQL Server 2005/2008后,进行附加数据库错误的解决
- Sql Server 2008/2005 数据库还原出现 3154错误
- Sql Server 2008/2005 数据库还原出现 3154错误
- Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结
- [解决方案]在Sql Server 2008/2005 数据库还原出现 3154错误
- 在数据库SQL Server 2005/2008中,查询包含某关键字的存储过程语句:
- Sql Server 2014/2012/2008/2005 数据库还原出现 3154错误的解决办法
- Visual C# 2008+SQL Server 2005 数据库与网络开发--第11章 LINQ--语言集成查询简介
- Visual C# 2008+SQL Server 2005 数据库与网络开发-- 15.4 查询数据
- Win7/Vista下安装SQL Server 2005/2008后,进行附加数据库错误的解决
- Visual C# 2008+SQL Server 2005 数据库与网络开发――3.2.6 查询关键字
- SQL Server 2005/2008 查询EXCEL
- Sql Server 2008/2005 数据库还原出现 3154错误
- Sql Server 2008/2005 数据库还原出现 3154错误
- SQL Server 2005 升级到2008后,事务复制的log reader出现错误