| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 593 人关注过本帖
标题:[求助]sql 语句是怎么执行的?
只看楼主 加入收藏
冰封情愁
Rank: 1
等 级:新手上路
威 望:1
帖 子:32
专家分:0
注 册:2006-12-7
收藏
 问题点数:0 回复次数:5 
[求助]sql 语句是怎么执行的?

有表 a
id name scorid result
2 张三 001 50
3 李四 005 90
4 张三 004 52
5 王二 003 25
6 麻子 002 62
7 李四 001 21
8 麻子 001 70
14 王五 003 82
16 张三 002 81
有查询语句
1. select * from a b where (select count(1) from a where name=b.name and id>b.id)=1
go
2. select * from a b where (select count(1) from a where name=b.name and id<b.id)=1
go

得到的结果如下
(1) 3 李四 005 90
4 张三 004 52
6 麻子 002 62

(2) 4 张三 004 52
7 李四 001 21
8 麻子 001 70
我想问的是,为什么是这样的结果? (这些查询语句都是没什么意义的,我只是想借上面的查询语句了解一下SQL是怎么执行?)

还有要是改为
select * from a where (select count(1) from a b where name=b.name and id>b.id)=1
得到的结果为空,为什么呢?

搜索更多相关主题的帖子: sql 语句 
2007-03-31 19:05
冰封情愁
Rank: 1
等 级:新手上路
威 望:1
帖 子:32
专家分:0
注 册:2006-12-7
收藏
得分:0 
这些查询语句是从cdsn 学来的,我只是变换一下表,改为自己数据里有的表,试试其中的语句

原CDSN的问题如下:
表机种:
id , name, num name表示机器名字,num 表示第几次进了机器
如:id name num
1 电冰箱 1
2 洗衣机 1
3 电冰箱 2
4 电冰箱 3
问题是:
1 显示某个机器最后一次引进的记录?
2 显示某个机器倒数第二次引进的记录,若只引进一次,则求该次记录?
第二问题结果如下:
id name num
2 洗衣机 1
3 电冰箱 2

有人用下面语句解决了
(1)select name,max(num) from tb1 group by name
或 select top 1 * from tb1 where name='电冰箱' order by num desc
(2)select name,num from tb1 a where (select count(1) from tb1 where name = a.name
and num<=a.num)=2 or (select count(1) from tb1 where name = a.name )=1

我对其中的(2)语句不清楚!!!请高手指教

2007-03-31 19:19
xiyou419
Rank: 1
等 级:新手上路
威 望:2
帖 子:104
专家分:0
注 册:2007-3-18
收藏
得分:0 
1. select * from a b where (select count(1) from a where name=b.name and id>b.id)=1
go

对于你的这条语句,可以看成是给a表设置一个别名b,在b 中查询.
查询条件是:从a中查询满足条件的行数为1的那行数据,条件:name=b.name and id>b.id

说的有点抽象,你再运行几遍好好看看,其他的语句都一样的.

道德往往可以弥补智慧的缺陷;但智慧永远不能填补道德的空白.
2007-04-02 22:21
冰封情愁
Rank: 1
等 级:新手上路
威 望:1
帖 子:32
专家分:0
注 册:2006-12-7
收藏
得分:0 
反复研究,终于明白了!!
也谢谢楼上的

2007-04-03 14:13
冰封情愁
Rank: 1
等 级:新手上路
威 望:1
帖 子:32
专家分:0
注 册:2006-12-7
收藏
得分:0 

为方便没看懂的人,我解释一下,不过解释得也是比较抽象的.


在NAME='李四'中,共两个记录,只有一个ID(ID=7)比ID=3大 所以显示ID=3的记录.

在NAME='张三'中,共3个记录.只有一个ID(ID=16)比ID=4大,所以显示ID=4的记录.(而ID=2的有两个(ID=4和ID=16)比它大,所以不显示,没有ID比ID=16更大的,所以ID=16的记录也不显示)

在NAME='麻子',只有一个ID(ID=8)比ID=6大 所以显示ID=6的记录.

所以得到结果
1) 3 李四 005 90
4 张三 004 52
6 麻子 002 62


2007-04-03 14:30
xiyou419
Rank: 1
等 级:新手上路
威 望:2
帖 子:104
专家分:0
注 册:2007-3-18
收藏
得分:0 

对了~~~~~~~~~~


道德往往可以弥补智慧的缺陷;但智慧永远不能填补道德的空白.
2007-04-03 18:08
快速回复:[求助]sql 语句是怎么执行的?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011548 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved