一条SQL语句不理解,请大侠帮忙解释。

表#T内容如图:执行语句:Selectidfrom#Tawhereexists(select1from#TwhereName=a.NameandID<a.ID)我认为结果... 表#T 内容如图:

执行语句:
Select id from #T a where exists(select 1 from #T where Name=a.Name and ID<a.ID)
我认为结果是:ID:1,2,4 但结果是:ID:2,3,5;为什么?我哪里理解错误了,
Select id from #T a where exists(select 1 from #T where Name=a.Name and ID>a.ID)
这条也是样,我认为是ID:2,3,5;结果为ID:1,2,4
我想了好久都没想通,请大侠们详解,最好讲下分析的过程,越详细越好,谢谢!!
展开
 我来答
tjrmgs
2012-07-06 · TA获得超过5765个赞
知道大有可为答主
回答量:2161
采纳率:94%
帮助的人:1052万
展开全部
先分析
Select id from #T a where exists(select 1 from #T where Name=a.Name and ID<a.ID)
这是一个父子关联EXISTS子查询语句,数据库引擎将采取多次测试EXISTS策略输出父查询记录集:
1) 取出父查询数据源表#T(表别名a)的第一条记录与子查询数据源表#T比较连接
ID Name Memo
1 A A1
尽管#T表有3条记录 Name字段下为"A",但是这3条记录的ID字段下没有一条记录满足小于1的条件,子查询无满足条件的行存在,EXISTS测试返回“假”,父查询第1条记录被抛弃;
2) 取出父查询数据源表#T(表别名a)的第二条记录与子查询数据源表#T比较连接
ID Name Memo
2 A A2
#T表有3条记录 Name字段下为"A",而且者3条记录下ID字段有1条(ID=1那条)记录满足小于2的条件,子查询有满足条件的行存在,EXISTS测试返回“真”,父查询第2条记录被保留(ID=2);
3) 取出父查询数据源表#T(表别名a)的第三条记录与子查询数据源表#T比较连接
ID Name Memo
3 A A3
#T表有3条记录 Name字段下为"A",而且这3条记录的ID字段下有2条(ID=1,D=2)记录满足小于3的条件,子查询有满足条件的行存在,EXISTS测试返回“真”,父查询第3条记录被保留(ID=3);
4) 取出父查询数据源表#T(表别名a)的第三条记录与子查询数据源表#T比较连接
ID Name Memo
4 B B1
尽管#T表有2条记录 Name字段下为"B",但是这2条记录的ID字段下没有记录满足小于4的条件,子查询无满足条件的行存在,EXISTS测试返回“假”,父查询第4条记录被抛弃;
5) 取出父查询数据源表#T(表别名a)的第五条记录与子查询数据源表#T比较连接
ID Name Memo
5 B B2
#T表有2条记录 Name字段下为"B",而且这2条记录的ID字段下有1条(ID=4那条)记录满足小于5的条件,子查询有满足条件的行存在,EXISTS测试返回“真”,父查询第5条记录被保留(ID=5)。
整合前面五次的EXISTS测试结果,该条记录集返回下列记录集:
ID
2
3
5

再分析
Select id from #T a where exists(select 1 from #T where Name=a.Name and ID>a.ID)
这是同样是一个父子关联EXISTS子查询语句,数据库引擎将采取多次测试EXISTS策略输出父查询记录集:
1) 取出父查询数据源表#T(表别名a)的第一条记录与子查询数据源表#T比较连接
ID Name Memo
1 A A1
#T表有3条记录 Name字段下为"A",而且这3条记录的ID字段下有2条记录(ID=2和ID=3)满足大于1的条件,子查询有满足条件的行存在,EXISTS测试返回“真”,父查询第1条记录被保留(ID=1);
2) 取出父查询数据源表#T(表别名a)的第二条记录与子查询数据源表#T比较连接
ID Name Memo
2 A A2
#T表有3条记录 Name字段下为"A",而且者3条记录下ID字段有1条(ID=3那条)记录满足大于2的条件,子查询有满足条件的行存在,EXISTS测试返回“真”,父查询第2条记录被保留(ID=2);
3) 取出父查询数据源表#T(表别名a)的第三条记录与子查询数据源表#T比较连接
ID Name Memo
3 A A3
尽管#T表有3条记录 Name字段下为"A",但是这3条记录的ID字段下没有记录满足大于3的条件,子查询无满足条件的行存在,EXISTS测试返回“假”,父查询第3条记录被抛弃;
4) 取出父查询数据源表#T(表别名a)的第三条记录与子查询数据源表#T比较连接
ID Name Memo
4 B B1
#T表有2条记录 Name字段下为"B",而且这2条记录的ID字段下有1条(ID=5那条)记录满足大于4的条件,子查询有满足条件的行存在,EXISTS测试返回“真”,父查询第4条记录被保留(ID=4);
5) 取出父查询数据源表#T(表别名a)的第五条记录与子查询数据源表#T比较连接
ID Name Memo
5 B B2
尽管#T表有2条记录 Name字段下为"B",但是这2条记录的ID字段下没有记录满足小大5的条件,子查询无满足条件的行存在,EXISTS测试返回“假”,父查询第5条记录被抛弃。
整合前面五次的EXISTS测试结果,该条记录集返回下列记录集:
ID
1
2
4

这里说明一下,使用父子关联EXISTS子查询,在WHERE子句里进行关联字段比较时,应只采用“=”比较符,至于其它比较符如>,<,<>不建议使用,如果使用的话其返回记录集会显得非常诡异,因为这些比较符会导致无法仅从SQL代码的逻辑上判断出准确的结果,须要配合数据表中实际存在的数据才能得到正确的结果,因此很不靠谱。父子关联EXISTS子查询主要用于求两表的交集或非交集,无需知道表中的具体记录就可以准确做出判断。如果要引入等号以外的比较符最好不要使用EXISTS谓词。

下面介绍两个EXISTS谓词的标准用法:

使用EXIS谓词求两表(甲表里与乙表“有”交集的记录)的典型写法:
SELECT * FROM 甲 AS A WHERE
EXISTS(SELECT * FROM 乙 WHERE A.比较字段=乙.比较字段)

使用EXIS谓词求两表(甲表里与乙表“无”交集的记录)的典型写法:
SELECT * FROM 甲 AS A WHERE
Not EXISTS(SELECT * FROM 乙 WHERE A.比较字段=乙.比较字段)

我会就EXISTS谓词的应用,在不久的将来写专文说明并发表到本人百度空间上,到时楼主可以过去看看。
jgsagdut
2012-07-06 · 超过25用户采纳过TA的回答
知道答主
回答量:107
采纳率:0%
帮助的人:63.2万
展开全部
如果exists不理解,你可以用连接的思想理解:
Select a.id from #T a ,#T b where b.Name=a.Name and b.ID<a.ID
由b.Name=a.Name得出了如:
a b
1 A A1 1 A A1
1 A A1 2 A A2
1 A A1 3 A A3
2 A A2 1 A A1
2 A A2 2 A A2
2 A A2 3 A A3
3 A A3 1 A A1
3 A A3 2 A A2
3 A A3 3 A A3
然后再由b.ID<a.ID得到
a b
1 A A1 2 A A2
1 A A1 3 A A3
2 A A2 3 A A3
所以就是A类的结果就是1,2
同样B类的结果就是4
最后就是:1,2,4
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
知识杂集
2012-07-06 · TA获得超过200个赞
知道小有建树答主
回答量:270
采纳率:0%
帮助的人:208万
展开全部
这个是正常的,这个是属于表的自连接+非等值连接。
当name=A的时候id最小为1,由于有一个条件是id<a.id这样查询就会过滤掉1.
当name=B的时候id最小为4,由于有一个条件是id<a.id这样查询就会过滤掉4.
相当于外面的一层查询ID要大于里面子查询最小的ID.
同理第二条sql也是一样,外面的一层查询ID要小于里面子查询最大的ID.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
656482173
2012-07-06 · TA获得超过613个赞
知道小有建树答主
回答量:271
采纳率:100%
帮助的人:206万
展开全部
第一个:假如最后结果为1,2,4
则当A.ID=1时,后面的ID<a.id的条件就不满足啊!因为1是最小的
当A.ID=2时,则有结果id<a.id的行是第一行

根据我的思路你自己在好好分析一下吧!我也不知道有没有描述清楚
反正关键就是要满足ID<a.ID这个条件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小强19830305
2012-07-06 · 超过16用户采纳过TA的回答
知道答主
回答量:107
采纳率:0%
帮助的人:34.6万
展开全部
ID<a.ID
当ID是3和5的时候这个条件是不满足的,后面那个反过来想就行了!
A和B分好组,不要混在一起,因为还有一个NAME=A.NAME的条件控制!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
amdy726
2012-07-06
知道答主
回答量:59
采纳率:33%
帮助的人:13.1万
展开全部
楼上正解,高
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式