登录
注册
论坛
空间
帮助
会员
界面
简洁版本
在线
微软BI开拓者
数据库专区
SQL Server开发
子查询里的列名匹配
数据库专区
SQL Server管理
SQL Server开发
SQL Azure云数据库
商业智能综述区
BI探讨
BI项目管理
数据仓库专区
ETCL设计
SSIS使用与管理
SSIS二次开发
多维分析专区
多维建模
SSAS配置管理
MDX
SSAS二次开发
数据挖掘专区
数据挖掘建模
DMX
DM应用开发
前端应用专区
SharePoint
SQL Server Reporting Services
PerformancePoint及其相关产品
其他
站务
灌水区
培训相关
求职招聘区
1
/ 1 页
1
跳转
页
查看:
250
[技术文档] 子查询里的列名匹配
拓狼
个人空间
组别:
管理员
性别:
来自:
北京 海淀
积分:
1124
帖子:
566
注册:
2007-05-23
2010-01-28 00:45
|
只看楼主
树型
|
收藏
|
小
中
大
1
子查询里的列名匹配
子查询里的列名匹配
--王成辉翻译整理,转帖请注明出自微软BI开拓者
www.windbi.com
--
原帖地址
子查询里的列匹配有点特殊。如果你曾经遇到过的话,那么可能不会犯第二次错了。现在让我们花点时间来研究一下。
有个表叫users,为了简便,只列出一部分必须的列:
CREATE TABLE dbo.Users
(
UserID INT PRIMARY KEY,
-- ... other columns ...
);
针对这个表,要选出特定的一些用户出来,具体的代码简单如下:
DECLARE @u TABLE (
id
INT PRIMARY KEY);
INSERT @u(id) SELECT 1 UNION ALL SELECT 2;
SELECT UserID FROM dbo.Users
WHERE UserID IN (SELECT
UserID
FROM @u);
请注意子查询里的列是userid,而不是id。运行这个查询,居然得到了源表的全部用户。为什么啊?大部分情况下不会有任何影响,但在子查询里,如果在引用的对象上找到不列,编译器就会试着在父查询里来绑定那列。如果没有找到的话,就会得到一个错误(非法的列名);如果找到了多个的话,会得到另一个错误(列名不明确)。但当正好有一个的时候,上面的查询就可以重写成下面的语句:
SELECT UserID FROM dbo.Users
WHERE UserID IN (SELECT UserID FROM dbo.Users);
-- which of course becomes:
SELECT UserID FROM dbo.Users;
注意如果@u没有记录的话,外层的查询也会没有记录返回。但如果只要子查询里有一条记录,那么外层查询就会返回所有的记录。这种错误很难诊断,所以一定要小心。
虽有智慧,不如乘势;虽有鎡基,不如待时。
君子学以聚之,问以辨之,宽以居之,仁以行之。
独学而无友,则孤陋而寡闻。
发送短消息
查看公共资料
查找该会员全部帖子
UID:
6
精华:
81
威望:
170
金钱:
1123.95 元
ProSrv-:
0
状态:
在线
group4968@xiaoi.com
494887861
<<
上一主题
|
下一主题
>>
1
/ 1 页
1
跳转
页
论坛跳转...
数据库专区
SQL Server管理
SQL Server开发
SQL Azure云数据库
商业智能综述区
BI探讨
BI项目管理
数据仓库专区
ETCL设计
SSIS使用与管理
SSIS二次开发
多维分析专区
多维建模
SSAS配置管理
MDX
SSAS二次开发
数据挖掘专区
数据挖掘建模
DMX
DM应用开发
前端应用专区
SharePoint
SQL Server Reporting Services
PerformancePoint及其相关产品
其他
站务
灌水区
培训相关
求职招聘区
内务
服务测试区
我的主题
我的帖子
我的精华
我的空间
帖子标题
空间日志
相册标题
作 者
我的主题
我的帖子
我的附件
我的精华
我的空间