注册 登录
编程论坛 SQL Server论坛

[求助]sql 语句是怎么执行的?

冰封情愁 发布于 2007-03-31 19:05, 601 次点击

有表 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
得到的结果为空,为什么呢?

5 回复
#2
冰封情愁2007-03-31 19:19
这些查询语句是从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)语句不清楚!!!请高手指教
#3
xiyou4192007-04-02 22:21
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

说的有点抽象,你再运行几遍好好看看,其他的语句都一样的.
#4
冰封情愁2007-04-03 14:13
反复研究,终于明白了!!
也谢谢楼上的
#5
冰封情愁2007-04-03 14:30

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


在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

#6
xiyou4192007-04-03 18:08

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

1